Это всё вряд ли.
Проще по горячей клавише останавливать таймер, высвобождать курсор, затем снова запускать. Тогда для слежения за существованием окна нужен отдельный таймер. Клавиша F11. Кстати, из предыдущего варианта две важных строчки выпали:
if (X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
Return
OnExit, Exit
Run, notepad.exe,,, PID
WinWait, ahk_pid %PID%
WinGet, hTargetWin, ID, ahk_pid %PID%
NumPut(WI, VarSetCapacity(WI, 56))
DllCall("GetWindowInfo", UInt, hTargetWin, UInt, &WI)
WBorder := NumGet(WI, 48)
HBorder := NumGet(WI, 52)
Border := WBorder > HBorder ? WBorder : HBorder
VarSetCapacity(RECT, 16)
SetTimer, WGP
SetTimer, WinExist
Return
WinExist:
if !WinExist("ahk_id " hTargetWin)
ExitApp
Return
WGP:
WinGet, AID, ID, A
if (AID != hTargetWin)
{
if !NotActiveTarget
DllCall("ClipCursor", UInt, 0), NotActiveTarget := 1, XPrev := ""
Return
}
NotActiveTarget =
WinGetPos, X, Y, W, H, ahk_id %hTargetWin%
if (X = XPrev && Y = YPrev && W = WPrev && H = HPrev)
Return
NumPut(X + Border, RECT), NumPut(Y + Border + 22, RECT, 4)
NumPut(X + W - Border, RECT, 8), NumPut(Y + H - Border, RECT, 12)
DllCall("ClipCursor", UInt, &RECT)
XPrev := X, YPrev := Y, WPrev := W, HPrev := H
Return
F11::
if (switch := !switch)
{
SetTimer, WGP, Off
DllCall("ClipCursor", UInt, 0)
}
Else
SetTimer, WGP, On
Return
Esc:: ExitApp
Exit:
DllCall("ClipCursor", UInt, 0)
ExitApp
InFlames пишет:К верхней границе прибавил 22 пикселя, что бы курсор перемещался только в рамках рабочей области, а границы не затрагивал.
Может, нужна клиентская область окна — всё кроме строки заголовка, строки меню и окантовки? Если да, то можно точно определить её границы, без всяких прибавлений с помощью функции GetWindowInfo.
Разработка AHK-скриптов:
e-mail
dfiveg@mail.ruTelegram
jollycoder