Я экспериментирую с подключением python с использованием SetWindowsHookExA с системой windows 10. Но код ASCII в верхнем регистре всегда фиксируется, и содержимое в структуре KBDLLHOOKSTRUCT точно такое же.
Я просмотрел документацию MSDN, но не смог найти никакой полезной информации
Я использую Python3 .7, ОС - Windows10
import sys
import ctypes
from ctypes import *
from ctypes.wintypes import DWORD, HHOOK, HINSTANCE, MSG, WPARAM, LPARAM
import time
user32 = CDLL("user32.dll")
kernel32 = CDLL("kernel32.dll")
class KBDLLHOOKSTRUCT(Structure):
_fields_ = [
('vkCode', DWORD),
('scanCode', DWORD),
('flags', DWORD),
('time', DWORD),
('dwExtraInfo', DWORD)]
def uninstallHookProc(hooked):
if hooked is None:
return
user32.UnhookWindowsHookEx(hooked)
hooked = None
def hookProc(nCode, wParam, lParam):
if nCode < 0:
return user32.CallNextHookEx(hooked, nCode, wParam, lParam)
else:
if wParam == 256:
if 162 == lParam.contents.value:
print("Ctrl pressed, call uninstallHook()")
uninstallHookProc(hooked)
sys.exit(-1)
x=cast(lParam,POINTER(KBDLLHOOKSTRUCT))
print(chr(lParam.contents.value))
return user32.CallNextHookEx(hooked, nCode, wParam, lParam)
def startKeyLog():
msg = MSG()
user32.GetMessageA(byref(msg), 0, 0, 0)
def installHookProc(hooked, pointer):
hooked = user32.SetWindowsHookExA(
13,
pointer,
kernel32.GetModuleHandleW(),
0
)
if not hooked:
return False
return True
HOOKPROC = WINFUNCTYPE(c_int, c_int,c_int, POINTER(DWORD))
pointer = HOOKPROC(hookProc)
hooked = None
if installHookProc(hooked, pointer):
print("Hook installed")
try:
msg = MSG()
user32.GetMessageA(byref(msg), 0, 0, 0)
except KeyboardInterrupt as kerror:
uninstallHookProc(hooked)
print("uninstall Hook")
else:
print("Hook installed error")
e = kernel32.GetLastError()
print(e)
Всегда возвращать ASCII
в верхнем регистре