代码如下
我的平台是 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-06-07 17:33:30 +08:00
确定挂钩好了? PCHunter 看一下
|
3
jin7 2020-06-07 19:15:12 +08:00
https://github.com/antiwar3/py
发现了这个 但是被检测为病毒 |
4
systemcall 2020-06-07 20:40:46 +08:00
是不是装了 QQ ?印象中 QQ 的服务会 hook 一些东西
|
5
dearmymy 2020-06-08 01:24:50 +08:00
关闭 360 腾讯系之类的试试。他们的驱动保护会拦截你这种危险操作。
win 下你想做拦截主要还是看你想干什么了。和你要拦截的对象。 |
6
augustheart 2020-06-08 08:36:56 +08:00 via Android
没用 py 做过这个,不过全局键盘钩子是需要通过 dll 注册的(好几年没写这个了,也行记错了,具体请参阅 msdn )
|
7
codehz 2020-06-08 13:50:05 +08:00
很多手段可以影响 hook 的效果,最常见的就是目标为特权进程,导致没有 uiAccess 权限的 hook 直接失效。。
然后 uiAccess 权限并不是想拿就能拿,至少得有一个软件签名,然而 python 虽然有对应签名,但是 manifest 里却没有声明需要这个特权,因此无论如何也没法在正常情况下通过 py 设置特权 hook |