为什么我的 SetWindowsHookEx 不可以成功获取键盘事件?

2020-06-07 17:27:28 +08:00
 Leon6868

代码如下
我的平台是 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)

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/679449

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX