Author Topic: Как сделать keypress и move одновременно  (Read 5355 times)

0 Members and 1 Guest are viewing this topic.

mahadin

  • Зашел в гости
  • *
  • Posts: 19
    • View Profile
Такой вопрос:
#ps2_mouse
#ps2_keyboard
WHILE(ISKEYDOWN (#e) = 0)
  waitms(50)
END_CYC
WHILE(ISKEYDOWN (#e) = 1)
waitms(10)
END_CYC
$xs = $_xmouse
$ys = $_ymouse
KEYPRESS(#q)
keypress(#space)
MOVE(624,360)
KEYPRESS(#r)
MOVE($xs,$ys)

вот скрипт, мне надо чтобы keypress(#r) и MOVE(624,360) присходил одновременно, чтобы я немог во время скрипта сбить своей мышкой нажатие клавиши в эту точку. Как альтернатива меня бы устроило заблочить свою мыш на время скрипта. Если кому интересно зачем мне это, я играю в лигу легенд, и на чемпионе jayce делаю комбу через портал в чемпиона, но если я шевельну мышью неудачно то портал может в неправильное место поставиться

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile


mahadin

  • Зашел в гости
  • *
  • Posts: 19
    • View Profile
Re: Как сделать keypress и move одновременно
« Reply #2 on: May 31, 2021, 09:02:05 AM »
Dll драмстера уже проверял, неработает, он и сам написал что у него не работает :(
Твой блок.ехе скачать немогу, винда нивкакую ехе скачивать нехочет. Видел ты код написал, но я не понял куда его писать  ;D
Там еще чел код скидывал с sub-ом, там немного не то что надо, мышка всеравно работает просто возвращается на место с небольшой задержкой

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как сделать keypress и move одновременно
« Reply #3 on: May 31, 2021, 09:51:29 AM »
Это значит только одно - ты не хозяин своему компьютеру. Всегда всё можно скачать приструнив паранойю винды. Антивирус в принципе всегда агрится на код AutoIT, даже если он пустой. А сжатый упаковщиком так он совсем не любит.
Всё скачивается и всё работает. Других вариантов у меня нет.


mahadin

  • Зашел в гости
  • *
  • Posts: 19
    • View Profile
Re: Как сделать keypress и move одновременно
« Reply #4 on: May 31, 2021, 10:44:06 AM »
я непонимаю что за парадокс произошел, но после твоих слов я еще раз нажал на блок.ехе и он скачался, проблема в том что блок.ехе срабатывает нормально ток один раз, а в последуующих нажатиях скрипта перестают нажиматься кнопки которые ниже по скрипту идут,
#ps2_mouse
#ps2_keyboard
WHILE(ISKEYDOWN (#e) = 0)
  waitms(50)
END_CYC
WHILE(ISKEYDOWN (#e) = 1)
waitms(10)
END_CYC
$xs = $_xmouse
$ys = $_ymouse
KEYPRESS(#q)
keypress(#space)
EXECUTE("block.exe", "200")
MOVE(734,283)
KEYPRESS(#r)
MOVE($xs,$ys)

перестает работать keypress(r) и еще как мне показалось срабатывает не мгновенно и всеравно из за этого успеваю мышкой курсор сдвинуть  :-[
« Last Edit: May 31, 2021, 10:49:35 AM by mahadin »

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Re: Как сделать keypress и move одновременно
« Reply #5 on: June 02, 2021, 12:25:45 AM »
Вот доработка идеи кода Винта из ссылки выше:
Code: [Select]
; wtd: drag up/dn wheel
;http://crapware.aidf.org/forum/index.php?topic=1860.msg11043#msg11043
;~ #include "Stringi.au3"
#RequireAdmin
#include <Array.au3>
If @Compiled Then
If $CmdLine[0] = 0 Then Exit(1)
BlockInput(1)
Select
;$CmdLine[]
Case $CmdLine[1] = 'click'
aNulled0($CmdLine,10)
Local $t = optMs1($CmdLine[7]), $t = optMs2($CmdLine[8]), $t = optMs3($CmdLine[9])
Click($CmdLine[2],$CmdLine[3],$CmdLine[4],$CmdLine[5],$CmdLine[6])
Case $CmdLine[1] = 'move'
aNulled0($CmdLine,6)
;~ pbox($CmdLine[5])
;~ ad($CmdLine)
Local $t = optMs3($CmdLine[5])
Move($CmdLine[2],$CmdLine[3],$CmdLine[4])
Case $CmdLine[1] = 'send'
aNulled0($CmdLine,8)
Local $t = optSnd1($CmdLine[4]), $t = optSnd2($CmdLine[5]), $t = optSnd3($CmdLine[6]), $t = optSnd4($CmdLine[7])
sendRaw($CmdLine[2],$CmdLine[3])
EndSelect
BlockInput(0)
EndIf

Func aNulled0( ByRef $array,$upto=0)
If $upto > UBound($array) Then
For $i = UBound($array)+1 To $upto; $[$i]
_ArrayAdd($array,'')
Next
EndIf
Return $array
EndFunc
#Region FNz; move($x=MouseGetPos(0),$y=MouseGetPos(1),$peed=1); click($btn='main',$x=MouseGetPos(0),$y=MouseGetPos(1),$clix=1,$peed=1); sendRaw($text='',$raw=0)
Func move($x=MouseGetPos(0),$y=MouseGetPos(1),$peed=1)
If StringLen($peed) = 0 Then $peed = 1
If StringLen($x) = 0 Then $x = MouseGetPos(0)
If StringLen($y) = 0 Then $y = MouseGetPos(1)
MouseMove($x,$y,$peed)
EndFunc
Func click($btn='main',$x=MouseGetPos(0),$y=MouseGetPos(1),$clix=1,$peed=1)
If StringLen($btn) = 0 Then $btn = 'main'
If StringLen($x) = 0 Then $x = MouseGetPos(0)
If StringLen($y) = 0 Then $y = MouseGetPos(1)
If StringLen($clix) = 0 Then $clix = 1
If StringLen($peed) = 0 Then $peed = 1
MouseClick($btn,$x,$y,$clix,$peed)
;~ If StringLen($x) <> 0 And StringLen($y) <> 0 Then MouseClick($btn,$x,$y,$clix,$peed)
EndFunc
Func sendRaw($text='',$raw=0)
If StringLen($raw) = 0 Then $raw = 0
If StringLen($text) <> 0 Then send($text,$raw)
EndFunc
#EndRegion
#Region - Options CmtdOut
;~ Opt('MouseClickDelay', 10) ; ? = 10 milliseconds by default.
;~ Opt('MouseClickDownDelay', 10) ; ? = 10 milliseconds by default.
;~ Opt('MouseCoordMode', 0) ; 1 = Absolute (default), 0 = Relative to active window, 2 = Relative to client area.
;+
;~ Opt('SendAttachMode', 1) ; 0 = Don't attach, 1 = Attach.
;~ Opt('SendCapslockMode', 0) ; 1 = Store and restore, 0 = Don't store / restore.
;~ Opt('SendKeyDelay', 5) ; ? = 5 milliseconds by default.
;~ Opt('SendKeyDownDelay', 1) ; ? = 1 millisecond by default.
#EndRegion
#Region OptFnz; MouseClickDownDelay MouseClickDelay MouseCoordMode; SendKeyDownDelay SendKeyDelay SendAttachMode SendCapslockMode
Func optMs1($val=10)
;~ If StringLen($val) = 0 Then $val = ;
;~ If StringLen($val) = 0 Then $val = 10
;~ If StringLen($val) <> 0 Then ;
If StringLen($val) <> 0 Then Opt('MouseClickDownDelay',$val)
EndFunc
Func optMs2($val=10)
If StringLen($val) <> 0 Then Opt('MouseClickDelay',$val)
EndFunc
Func optMs3($val=1)
If StringLen($val) <> 0 Then Opt('MouseCoordMode',$val)
EndFunc

Func optSnd1($val=1)
If StringLen($val) <> 0 Then Opt('SendKeyDownDelay',$val)
EndFunc
Func optSnd2($val=5)
If StringLen($val) <> 0 Then Opt('SendKeyDelay',$val)
EndFunc
Func optSnd3($val=1)
If StringLen($val) <> 0 Then Opt('SendAttachMode',$val)
EndFunc
Func optSnd4($val=0)
If StringLen($val) <> 0 Then Opt('SendCapslockMode',$val)
EndFunc
#EndRegion


К вложенному архиву с программой прилагается батник с закомментированными примерами аргументов для запуска программы (собиралось в версии 3,3,14,2). В общем, синтаксис сводится к трём основным командам (move/click/send), которые вполне соответствуют АвтоИтовскому формату:
Code: [Select]
blockedInput.exe move x y speed MouseCoordMode
blockedInput.exe click button x y clicks speed MouseClickDownDelay MouseClickDelay MouseCoordMode
blockedInput.exe send string raw SendKeyDownDelay SendKeyDelay SendAttachMode SendCapslockMode

move = перемещение мыши (если координата не задана и используется пустой параметр "", то используется текущая координата мыши)
click = для нажатия левой или правой кнопкой мыши (параметр button равен "main" или "menu" соответственно)
send = отсылка нажатий клавиш или хоткеев с клавиатуры (!=alt +=shift ^=ctrl #=win, сама кнопка заключается фигурно: например, "{up}" значит Вверх, "^+3"=ctrl-shift-3, а "^{ins}"=ctrl-insert)

Коды остальных клавиш можно найти в справке по AutoIt, гуглите, там всё просто/линейно/ожидаемо, без особых сюрпризов. Для нажатия и отпускание шифта шлём "{shiftdown}{shiftup}". Различаются также и левые/правые модификаторы в хоткеях. Саму клавишу лучше писать строчной буквой (напр., "^f", а не "^F" для отсылки хоткея Ctrl-F). Иногда с хоткеями возникают трудности при наборе латинских букв в русской раскладке (тогда на замену нужно использовать функциональные клавиши: "^{f4}"). Для нажатия таба три раза шлём "{tab 3}", для нажатия ABCD -- "ABCD" (только для букв, в отличие от небуквенных кнопок типа "{del}", опять же, следите за раскладкой). Вводимые названия кнопок в фигурных скобках регистронезависимы.

Все аргументы/параметры запуска программы, кроме этих трёх основных параметров move/click/send, являются факультативными (их можно пропускать, заменяя пустым текстом "").

Значения остальных параметров:

x, y - координаты мыши (по умолчанию, если другое не указано или параметр опущен, то это текущие координаты курсора мыши. Можно, к примеру, заменить одну координату пустым текстом, то есть дефолтным значением, тогда перемещение будет только по одной оси, по прямой, а не по диагонали)
speed - скорость перемещения от 0 до 100
clicks - нужное количество кликов (дефолтно равно 1)

Для мыши также:
MouseClickDownDelay - задержка между нажатием и отпускание кнопки мыши (мс)
MouseClickDelay - задержка между кликами (в миллисекундах)
MouseCoordMode - система координат (дефолтно 1 = абсолютная, 0 = относительно текущего окна, 2 = относительно клиентских координат)

Для клавы:
SendKeyDownDelay - задержка внутри нажатия одной клавиши клавиатуры
SendKeyDelay - задержка (мс) между нажатиями отдельных клавиш (кнопок)
SendAttachMode - режим привязки (0=откл дефолтно, 1=вкл)
SendCapslockMode - отслеживание капса (0 дефолт/1)

Таким образом, чтобы запустить данную программу из Кликерманна, нужно ввести:
Code: (clickermann) [Select]
EXECUTE("blockedInput.exe", "move 0 0")  // перемещаем курсор мыши в точку (0;0), тем самым пряча курсор на границе экрана (мгновенно)
EXECUTE("blockedInput.exe", "move 100 200 40")  // перемещаем курсор мыши в точку (100;200) со скоростью 40
EXECUTE("blockedInput.exe", "click main 1800 63")  // кликаем основной кнопкой мыши в точку (1800;63) со скоростью 1 (мгновенно)
EXECUTE("blockedInput.exe", "click menu 1800 63 1 40")  // кликаем второй кнопкой мыши (менюшкой) в точку (1800;63) со скоростью 40 (плавно), делая 1 клик
EXECUTE("blockedInput.exe", "send #{down}")  // шлём с клавиатуры нажатие Win+Вниз (сворачиваем окно) (send -- аналог KeyPress в клмн)
EXECUTE("blockedInput.exe", "send #{up}")  // шлём с клавиатуры нажатие Win+СтрелкаВверх (разворачиваем окно)
// etc
halt

В качестве лайфхака можно добавить, что если при ввода параметра вам понадобится кавычка (а такая необходимость не редка в Клмн), то её вы можете предварительно прочитать в переменную из специально созданного файла с единственным символом кавычки.

PS. К сожалению, не разбираюсь в WinAPi и поэтому не знаю, как точно написать эту прогу через SendMessage (не знаю нужных значений кнопок для low/high word), но также понимаю, что данная программа будет не полностью эффективна в случае экстремальных нагрузок, поскольку она не будет сидеть в памяти, а лишь запускаться непосредственно во время вызова (а само время вызова тоже не нулевое, что будет вызывать дополнительную задержку при чтении программы с диска и допустимо не во всех сценариях применения).

ППС. Напоминаю, что на время нажатия программа блокирует ввод, таким образом, если при вводе CLI параметров вы ошиблись с указанием переменных, то программа заблокирует ввод  данных с клавиатуры/мыши и вы не сможете ничего нажать. Чтобы этого избежать (разблокировать закрытый ввод), нажмите Ctrl-Alt-Del (надеюсь, у вас не WinXP )). 

Также добавлю в постскриптум, что еле получилось добавить архив во вложения для этого пришлось удалять большинство своих вложений (а именно картинки с иллюстрациями багов/скриншотов, коих набралось с десяток размером около полуметра). Выходит, суммарный максимальный объём вложений всех вложений во всех темах на участника -- 1 мегабайт?

Во вложении ниже имеется исходник программы и сам запускающийся, исполнимый файл [Compiled.exe] под WinX32, архив запакован свежей версией 7z/zip:
« Last Edit: June 02, 2021, 12:39:33 AM by Cleoss »

mahadin

  • Зашел в гости
  • *
  • Posts: 19
    • View Profile
Re: Как сделать keypress и move одновременно
« Reply #6 on: June 04, 2021, 01:06:54 PM »
большое спасибо за труд Cleoss, щас буду изучать все что вы написали и пытаться применить