Тема: AHK: ControlSend как увеличить скорость или аналог команды
#NoEnv
#Persistent
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
Menu, Tray, UseErrorLevel
Menu, Tray, NoStandard
Menu, Tray, Add, Reload
Menu, Tray, Add, Exit
OnExit, Exit
CoordMode, Pixel, Screen
SetBatchLines, -1
SetWinDelay, -1
SetControlDelay, -1
SetKeyDelay, -1
Global pToken := GDIP_StartUp()
, wWin1 := "ahk_class GxWindowClass ahk_exe Win64.exe", hWin1, Scan0, Stride
, sleep_time = 30
, index, index_old, i = 0
, x1 := "0", y1 := "0", x2, y2, x3, y3
, StatusLoop := "Okay"
, wWin2 := "ahk_class GxWindowClass ahk_exe Win65.exe", hWin2 := WinExist(wWin2)
, wWin3 := "ahk_class GxWindowClass ahk_exe Win66.exe", hWin3 := WinExist(wWin3)
WinGetPos, x2, y2,,, ahk_id %hWin2%
WinGetPos, x3, y3,,, ahk_id %hWin3%
Loop
{
sleep, -1
If !(hWin1 := WinExist(wWin1)) {
TrayTip, % SubStr(A_ScriptName, 1, -4), Окно Win не найдено,, 2
sleep, 10000
Continue
}
If i > 3 ; Сброс индекса
i := 0
i++ ; Индекс
;~ Start := A_TickCount
UpdateMemDC()
current_window := i = 3 ? hWin3
: i = 2 ? hWin2
: i = 1 ? hWin1
: 0
If !Pixel(x i + 114, y i + 188, 0x00FF00,, 300) ; #1
ControlSend,, {vk32}, ahk_id %current_window%
If !Pixel(x i + 122, y i + 188, 0x00FF00,, 300) ; #2
ControlSend,, {vk33}, ahk_id %current_window%
If !Pixel(x i + 129, y i + 188, 0x00FF00,, 300) ; #3
ControlSend,, {vk58}, ahk_id %current_window%
If !Pixel(x i + 135, y i + 188, 0x00FF00,, 300) ; #4
ControlSend,, {vk36}, ahk_id %current_window%
If !Pixel(x i + 142, y i + 188, 0x00FF00,, 300) ; #5
ControlSend,, {vk35}, ahk_id %current_window%
If !Pixel(x i + 149, y i + 188, 0x00FF00,, 300) ; #6
ControlSend,, {vk37}, ahk_id %current_window%
If !Pixel(x i + 114, y i + 194, 0x00FF00,, 300) ; #7
ControlSend,, {vk38}, ahk_id %current_window%
If !Pixel(x i + 122, y i + 194, 0x00FF00,, 300) ; #8
ControlSend,, {vk52}, ahk_id %current_window%
If !Pixel(x i + 129, y i + 194, 0x00FF00,, 300) ; #9
ControlSend,, {vk42}, ahk_id %current_window%
If !Pixel(x i + 135, y i + 194, 0x00FF00,, 50) ; #10
ControlSend,, {vk46}, ahk_id %current_window%
}
Return
ProcessExist(Name){
Process,Exist,%Name%
return Errorlevel
}
Exit:
{
GDIP_Shutdown(pToken)
DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
ExitApp
}
Return
;; [Цвет]
UpdateMemDC() {
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
pBitmap := Gdip_BitmapFromScreen()
Gdip_LockBits(pBitmap, 0, 0, 1679, 1049, Stride, Scan0, BitmapData)
}
Pixel(x, y, color = "", variation = 0, delay = "") {
Static oDelay := {}
If (delay != "") {
If (oDelay[x, y, color] != "" && A_TickCount - oDelay[x, y, color] < delay)
Return 1
oDelay[x, y, color] := A_TickCount
}
c := Gdip_GetLockBitPixel(Scan0, x, y, Stride)
bgr := bgr(c)
If color =
Return bgr
If variation
Return Between(bgr, color, variation)
Return bgr != color
}
bgr(color) {
Return Format("{:#08x}", ((Color & 0xff) << 16) + (((Color & 0x00ff00) >> 8) << 8) + ((Color & 0xff0000) >> 16))
}
Between(Num, Pat, Range="") {
If !Range
Return Num != Pat
SetFormat, IntegerFast, h
If (StrLen(Num) != 8) {
SetFormat, IntegerFast, d
Return 1
}
n1 := (0xff0000 & Num) >> 16
n2 := (0x0000ff00 & Num) >> 8
n3 := (0xff & Num)
p1 := (0xff0000 & Pat) >> 16
p2 := (0x0000ff00 & Pat) >> 8
p3 := (0xff & Pat)
bool := (n1 >= p1 - Range && n1 <= p1 + Range) && (n2 >= p2 - Range && n2 <= p2 + Range) && (n3 >= p3 - Range && n3 <= p3 + Range)
SetFormat, IntegerFast, d
Return !bool
}
Очень медленно доходят нажатия в посылаемые окна. Прикрутил SetKeyDelay, SetBatchLines и даже от админа запуск делал, но скорость не устраивает при слишком интенсивном вызове команды в разные окна.
Такое ощущение, что есть какое-то ограничение на ControlSend при интенсивном вызове.
Возможно есть альтернатива команде ControlSend, например через DllCall? Быть может остались способы о которых я не знаю с тем же ControlSend? Или через PostMessage как-то можно реализовать посылку горячих клавиш?
PostMessage, 0x100, 0x20, 1, ahk_id %hWin1%
PostMessage, 0x101, 0x20, 1, ahk_id %hWin1%
PostMessage, 0x102, 0x20, 1, ahk_id %hWin1%
PostMessage, 0x312, 0x20, 1, ahk_id %hWin1%
С этим вариантом как-то не особо удачно вышло, не работает. hWin1 содержит PID окна, но отправка туда не происходит.