Вот доработка идеи кода Винта из ссылки
выше:
; 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), которые вполне соответствуют АвтоИтовскому формату:
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)
Таким образом, чтобы запустить данную программу из Кликерманна, нужно ввести:
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: