Python PyHook不';在某些窗口中检测不到按键

Python PyHook不';在某些窗口中检测不到按键,python,pyhook,Python,Pyhook,我运行了这个PyHook示例代码: import pythoncom, pyHook def OnKeyboardEvent(event): print 'MessageName:',event.MessageName print 'Message:',event.Message print 'Time:',event.Time print 'Window:',event.Window print 'WindowName:',event.Wind

我运行了这个PyHook示例代码:

    import pythoncom, pyHook

def OnKeyboardEvent(event):
    print 'MessageName:',event.MessageName
    print 'Message:',event.Message
    print 'Time:',event.Time
    print 'Window:',event.Window
    print 'WindowName:',event.WindowName
    print 'Ascii:', event.Ascii, chr(event.Ascii)
    print 'Key:', event.Key
    print 'KeyID:', event.KeyID
    print 'ScanCode:', event.ScanCode
    print 'Extended:', event.Extended
    print 'Injected:', event.Injected
    print 'Alt', event.Alt
    print 'Transition', event.Transition
    print '---'

# return True to pass the event to other handlers
    return True

# create a hook manager
hm = pyHook.HookManager()
# watch for all mouse events
hm.KeyDown = OnKeyboardEvent
# set the hook
hm.HookKeyboard()
# wait forever
pythoncom.PumpMessages()
尝试它,它在大多数窗口中都能工作,但当我在游戏窗口中尝试它时,它就好像我没有按任何键一样


有没有一种方法可以听特定过程中的按键?我该怎么办?

我引用的是您从哪里获得此代码的同一页。

如果您使用的是GUI工具包(例如wxPython),则此循环是不必要的,因为该工具包提供了自己的循环


我认为您应该将pythoncom.PumpMessages()更改为其他我不知道的内容。

尝试使用键盘。下面是Github上键盘页面的一个示例。您必须使用
sudo
通过命令(在命令提示符下)
sudopython file.py

import sys
sys.path.append('..')
import keyboard
def print_pressed_keys(e):
    line = ', '.join(str(code) for code in keyboard._pressed_events)
    # '\r' and end='' overwrites the previous line.
    # ' '*40 prints 40 spaces at the end to ensure the previous line is cleared.
    print('\r' + line + ' ' * 40k, end='')


keyboard.hook(print_pressed_keys)
keyboard.wait()

您的问题可能是由于您的计算机将游戏优先于您的按键程序,因此当您按键时,输入将直接进入游戏,而不是通过您的程序

编辑:

实际上,有一种方法可以做到这一点。如果按ctrl+alt+del键并选择任务管理器(windows),您应该能够看到python程序的名称。现在,右键单击该按钮并选择“转到详细信息”。这将完全改变格式。在不单击任何其他内容的情况下,右键单击突出显示的内容(应以蓝色突出显示),然后将鼠标悬停在
设置优先级
上。这将打开一个下拉菜单,您可以将其设置为
实时


另一种确保执行此操作的方法是,使用相同的步骤将游戏的优先级设置为低于正常值的
,但单击游戏

游戏通常使用钩子来处理输入,方式与您尝试的方式大致相同,钩子在windows下的工作方式是一条链,IIRC添加的最后一个钩子是调用的第一个钩子,因此,如果您在游戏之前启动脚本,那么游戏钩子可能会在您的之前调用,处理事件,因此不会有任何内容到达您的挂钩


另一种可能性是,为了防止人们编写脚本/自动化游戏或以其他方式制作帮助玩家的东西,游戏将定期重新注册挂钩,以确保挂钩始终位于挂钩链的顶端,如果是这种情况,那么您将发现难以克服。

这也是全球性的。