V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Leon6868
V2EX  ›  Python

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

  •  
  •   Leon6868 · 2020-06-07 17:27:28 +08:00 · 1992 次点击
    这是一个创建于 1630 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    7 条回复    2020-06-08 13:50:05 +08:00
    yulihao
        1
    yulihao  
       2020-06-07 17:33:30 +08:00
    确定挂钩好了? PCHunter 看一下
    Leon6868
        2
    Leon6868  
    OP
       2020-06-07 17:43:17 +08:00
    @yulihao PCHunter 用不了,我的 Win10 版本很新
    jin7
        3
    jin7  
       2020-06-07 19:15:12 +08:00
    https://github.com/antiwar3/py
    发现了这个 但是被检测为病毒
    systemcall
        4
    systemcall  
       2020-06-07 20:40:46 +08:00
    是不是装了 QQ ?印象中 QQ 的服务会 hook 一些东西
    dearmymy
        5
    dearmymy  
       2020-06-08 01:24:50 +08:00
    关闭 360 腾讯系之类的试试。他们的驱动保护会拦截你这种危险操作。
    win 下你想做拦截主要还是看你想干什么了。和你要拦截的对象。
    augustheart
        6
    augustheart  
       2020-06-08 08:36:56 +08:00 via Android
    没用 py 做过这个,不过全局键盘钩子是需要通过 dll 注册的(好几年没写这个了,也行记错了,具体请参阅 msdn )
    codehz
        7
    codehz  
       2020-06-08 13:50:05 +08:00
    很多手段可以影响 hook 的效果,最常见的就是目标为特权进程,导致没有 uiAccess 权限的 hook 直接失效。。
    然后 uiAccess 权限并不是想拿就能拿,至少得有一个软件签名,然而 python 虽然有对应签名,但是 manifest 里却没有声明需要这个特权,因此无论如何也没法在正常情况下通过 py 设置特权 hook
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2748 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:08 · PVG 23:08 · LAX 07:08 · JFK 10:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.