
代码如下
我的平台是 Windows10
为什么这样写不可以获取键盘事件?
# coding=utf-8 from ctypes import * from ctypes import wintypes import win32con SetWindowsHookEx=windll.user32.SetWindowsHookExA UnhookWindowsHookEx=windll.user32.UnhookWindowsHookEx CallNextHookEx=windll.user32.CallNextHookEx GetMessage=windll.user32.GetMessageA GetModuleHandle=windll.kernel32.GetModuleHandleW #保存键盘钩子函数句柄 keyboard_hd = None class KBDLLHOOKSTRUCT(Structure): _fields_ = [ ('vkCode',c_int), ('scanCode', c_int), ('flags', c_int), ('time', c_int), ('dwExtraInfo', c_uint), ('',c_void_p) ] def wait_for_msg(): msg = wintypes.MSG() GetMessage(msg, 0, 0, 0) def keyboard_pro(nCode, wParam, lParam): """ 函数功能:键盘钩子函数,当有按键按下时此函数被回调 """ if nCode == win32con.HC_ACTION: KBDLLHOOKSTRUCT_p = POINTER(KBDLLHOOKSTRUCT) param=cast(lParam,KBDLLHOOKSTRUCT_p) print(param.contents.vkCode) # return CallNextHookEx(keyboard_hd, nCode, wParam, lParam) # 屏蔽事件 return None def start_keyboard_hook(): """ 函数功能:启动键盘监听 """ HOOKPROTYPE = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p)) pointer = HOOKPROTYPE(keyboard_pro) keyboard_hd = SetWindowsHookEx( win32con.WH_KEYBOARD_LL, pointer, GetModuleHandle(None), 0) wait_for_msg() def stop_keyboard_hook(): """ 函数功能:停止键盘监听 """ UnhookWindowsHookEx(keyboard_hd) start_keyboard_hook() (python3 似乎不能用 pyHook)
1 yulihao 2020 年 6 月 7 日 确定挂钩好了? PCHunter 看一下 |
3 jin7 2020 年 6 月 7 日 https://github.com/antiwar3/py 发现了这个 但是被检测为病毒 |
4 systemcall 2020 年 6 月 7 日 是不是装了 QQ ?印象中 QQ 的服务会 hook 一些东西 |
5 dearmymy 2020 年 6 月 8 日 关闭 360 腾讯系之类的试试。他们的驱动保护会拦截你这种危险操作。 win 下你想做拦截主要还是看你想干什么了。和你要拦截的对象。 |
6 augustheart 没用 py 做过这个,不过全局键盘钩子是需要通过 dll 注册的(好几年没写这个了,也行记错了,具体请参阅 msdn ) |
7 codehz 2020 年 6 月 8 日 很多手段可以影响 hook 的效果,最常见的就是目标为特权进程,导致没有 uiAccess 权限的 hook 直接失效。。 然后 uiAccess 权限并不是想拿就能拿,至少得有一个软件签名,然而 python 虽然有对应签名,但是 manifest 里却没有声明需要这个特权,因此无论如何也没法在正常情况下通过 py 设置特权 hook |