1
2
3
4
5
6
7 import threading
8 import comtypes.client
9 import time
10 from ctypes import *
11 from ctypes.wintypes import *
12 from win32con import WM_QUIT, HC_ACTION, WH_KEYBOARD_LL, LLKHF_UP, LLKHF_EXTENDED, LLKHF_INJECTED, WH_MOUSE_LL, LLMHF_INJECTED
15 _fields_=[
16 ('vkCode',DWORD),
17 ('scanCode',DWORD),
18 ('flags',DWORD),
19 ('time',DWORD),
20 ('dwExtraInfo',DWORD),
21 ]
22
24 _fields_=[
25 ('pt',POINT),
26 ('mouseData',DWORD),
27 ('flags',DWORD),
28 ('time',DWORD),
29 ('dwExtraInfo',DWORD),
30 ]
31
32 keyDownCallback=None
33 keyUpCallback=None
34 mouseCallback=None
35
36 @WINFUNCTYPE(c_long,c_int,WPARAM,LPARAM)
37 -def keyboardHook(code,wParam,lParam):
38 if code!=HC_ACTION:
39 return windll.user32.CallNextHookEx(0,code,wParam,lParam)
40 kbd=KBDLLHOOKSTRUCT.from_address(lParam)
41 if keyUpCallback and kbd.flags&LLKHF_UP:
42 if not keyUpCallback(kbd.vkCode,kbd.scanCode,bool(kbd.flags&LLKHF_EXTENDED),bool(kbd.flags&LLKHF_INJECTED)):
43 return 1
44 elif keyDownCallback:
45 if not keyDownCallback(kbd.vkCode,kbd.scanCode,bool(kbd.flags&LLKHF_EXTENDED),bool(kbd.flags&LLKHF_INJECTED)):
46 return 1
47 return windll.user32.CallNextHookEx(0,code,wParam,lParam)
48
49 @WINFUNCTYPE(c_long,c_int,WPARAM,LPARAM)
50 -def mouseHook(code,wParam,lParam):
58
59 hookThread=None
60 hookThreadRefCount=0
63 keyHookID=windll.user32.SetWindowsHookExW(WH_KEYBOARD_LL,keyboardHook,windll.kernel32.GetModuleHandleW(None),0)
64 if keyHookID==0:
65 raise OSError("Could not register keyboard hook")
66 mouseHookID=windll.user32.SetWindowsHookExW(WH_MOUSE_LL,mouseHook,windll.kernel32.GetModuleHandleW(None),0)
67 if mouseHookID==0:
68 raise OSError("Could not register mouse hook")
69 msg=MSG()
70 while windll.user32.GetMessageW(byref(msg),None,0,0):
71 pass
72 if windll.user32.UnhookWindowsHookEx(keyHookID)==0:
73 raise OSError("could not unregister key hook %s"%keyHookID)
74 if windll.user32.UnhookWindowsHookEx(mouseHookID)==0:
75 raise OSError("could not unregister mouse hook %s"%mouseHookID)
76
83
92
102