Забыл обсуждали или нет, по теме физическое нажатие или эмулированное.
ММ клавиши всегда определяются как эмулированные.
Ext := NumGet(lp + 0, 8, "UInt")
NFP := (LLKHF_EXTENDED >> 4) & 1
CoordMode, ToolTip
hHookKeybd := DllCall("SetWindowsHookEx"
, Int, WH_KEYBOARD_LL := 13
, Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast")
, Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
, UInt, 0, Ptr)
OnExit( Func("Exit").Bind(hHookKeybd) )
Return
Esc::ExitApp
Exit(hHookKeybd) {
DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
}
LowLevelKeyboardProc(nCode, wParam, lParam) {
static oMem := [], lpData, size := VarSetCapacity(lpData, 16, 0)
DllCall("RtlMoveMemory", Ptr, &lpData, Ptr, lParam, Ptr, size)
oMem.Push([wParam, &lpData])
timer := Func("EventHandling").Bind(oMem) ; во избежание фризов клавиатуры обработка событий должна
SetTimer, % timer, -10 ; происходить обязательно по таймеру, а не в теле этой функции
Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
}
EventHandling(oMem) {
static oMsg := {0x100: "WM_KEYDOWN", 0x101: "WM_KEYUP", 0x104: "WM_SYSKEYDOWN", 0x105: "WM_SYSKEYUP"}
, oMembers := ["vk", "sc", "flags", "time"]
, oFlagOffsets := {LLKHF_EXTENDED: 0, LLKHF_LOWER_IL_INJECTED: 1, LLKHF_INJECTED: 4, LLKHF_ALTDOWN: 5, LLKHF_UP: 7}
while (oMem[1] != "") {
key := oMem.RemoveAt(1)
wp := key[1], lp := key[2]
msg := wp
for k, v in oMembers
%v% := NumGet(lp + (k - 1)*4, "UInt")
for k, v in oFlagOffsets
%k% := (flags >> v) & 1
sc |= LLKHF_EXTENDED << 8
Ext := NumGet(lp + 0, 8, "UInt")
NFP := (LLKHF_EXTENDED >> 4) & 1
; текстовые значения в oMembers и названия ключей в oFlagOffsets являются
; названиями переменных, в которых теперь находятся соответствующие значения:
ToolTip % "Message = " . oMsg[msg] . "`n"
. "vkCode = " . Format("{:#x}", vk) . "`n"
. "scCode = " . Format("{:#x}", sc) . "`n"
. "pressed = " . !LLKHF_UP . "`n"
. "Time = " . time . "`n"
. "Injected = " . LLKHF_INJECTED . "`n"
. "Lower_IL_Injected = " . LLKHF_LOWER_IL_INJECTED
. "`n" (NFP ? "Не физическое нажатие" : "Физическое нажатие")
}
}
Кстати АНК не может определить через GetKeyState что ММ зажата, хотя в хуке есть события DOWN и UP.
По вопросам возмездной помощи пишите на
E-Mail: serzh82saratov@mail.ru Telegram:
https://t.me/sergiol982Win10x64
AhkSpy,
Hotkey,
ClockGui