Скрипт, посылающий нажатия:
^vk50:: ; Ctrl + P
SetTimer, SendKey, % (i := !i) ? "On" : "Off"
Return
SendKey:
if !GetKeyState("Ctrl", "P")
SendInput, {!}
Return
Скрипт, блокирующий первый скрипт:
#Persistent
ScriptName := "KeySender.ahk" ; имя скрипта, который нужно поставить на паузу
BlockPeriod := 3000 ; время, на которое нужно остановить скрипт
Blocker.Init(ScriptName, BlockPeriod)
Return
class Blocker
{
Init(ScriptName, time) {
this.ScriptName := ScriptName
this.BlockTime := time
this.UnBlock := this.UnBlockTimer.Bind(this)
this.hHookKeybd := DllCall("SetWindowsHookEx"
, Int, WH_KEYBOARD_LL := 13
, Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast")
, Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
, UInt, 0, Ptr)
}
Block() {
if !hWnd := this.GetScriptMainWindow()
Return
if !this.Blocked {
this.Blocked := 1
WinMenuSelectItem, % "ahk_id" hWnd,, 1&, 5&
}
timer := this.UnBlock
SetTimer, % timer, % "-" this.BlockTime
}
UnBlockTimer() {
WinMenuSelectItem, % "ahk_id" this.GetScriptMainWindow(),, 1&, 5&
this.Blocked := 0
}
GetScriptMainWindow() {
SetTitleMatchMode, 2
DetectHiddenWindows, On
Return WinExist(this.ScriptName)
}
}
LowLevelKeyboardProc(nCode, wParam, lParam)
{
static LLKHF_INJECTED := 0x10, INJECTED
flags := NumGet(lParam + 8, "UInt")
INJECTED := (flags & LLKHF_INJECTED) >> 4
SetTimer, EventHandling, -10
Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
EventHandling:
if !INJECTED
Blocker.Block()
Return
}
Сохраняем первый скрипт, как KeySender.ahk. Запускаем его. Потом запускаем второй скрипт. Открываем блокнот, нажимаем Ctrl + P (старт посыла клавиш), и посылающий скрипт через время, указанное во втором скрипте (3000 мс), начинает отправлять в блокнот клавишу {!}. Пробуем что-нибудь напечатать. После каждого физического нажатия клавиш посылающий скрипт должен ставиться на паузу на 3 секунды.
Разработка AHK-скриптов:
e-mail
dfiveg@mail.ruTelegram
jollycoder