在后台检测Python中的按键事件

15 投票
4 回答
32511 浏览
提问于 2025-05-10 21:20

我想找到一种方法,可以检测到按键,然后根据按下的是哪个键来执行一个方法。

我已经可以用Tkinter做到这一点。但我遇到的问题是,当窗口在后台时,我无法检测到按键。我会在玩游戏的时候让这个程序在后台运行。我需要它能够在我玩游戏的时候也能检测到输入。

有没有办法用Tkinter或者其他什么方法做到这一点?最好是我不需要下载任何外部的东西,因为我想把这个程序分享给其他人。

相关文章:

  • 暂无相关问题
暂无标签

4 个回答

1

可以查看 pynput 这个链接。

def on_release(key):
    
    global running
    
    if key == keyboard.Key.esc:
        running = False;

running = True

listener = keyboard.Listener(on_release=on_release)
# run listener in background so that the while loop gets executed
listener.start()

while running
    print("running some code")

listener.stop()
3

要获取你按键事件的所有属性,你可以这样做:

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()

现在你可以知道按键的所有细节,并在此基础上进行操作。

按下's'键的情况看起来像这样:

MessageName: key down
Message: 256
Time: 449145375
Window: 2558060
WindowName: "file name"
Ascii: 115 s
Key: S
KeyID: 83
ScanCode: 31
Extended: 0
Injected: 0
Alt 0
Transition 0
6

我建议不要再使用pyHook这个库了,因为它太旧了,而且没有人维护(最后一次更新是在2008年)。

现在有很多其他的库是活跃维护的,比如pynput

from pynput.keyboard import Key, Listener


def on_press(key):
    print('{0} pressed'.format(key))


def on_release(key):
    print('{0} release'.format(key))
    if key == Key.esc:
        return False


with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

另外,keyboard也是一个值得考虑的替代选择。

6

pyHook 看起来很适合这个用途(这是furas提到的)

from pyHook import HookManager
from win32gui import PumpMessages, PostQuitMessage

class Keystroke_Watcher(object):
    def __init__(self):
        self.hm = HookManager()
        self.hm.KeyDown = self.on_keyboard_event
        self.hm.HookKeyboard()


    def on_keyboard_event(self, event):
        try:
            if event.KeyID  == keycode_youre_looking_for:
                self.your_method()
        finally:
            return True

    def your_method(self):
        pass

    def shutdown(self):
        PostQuitMessage(0)
        self.hm.UnhookKeyboard()


watcher = Keystroke_Watcher()
PumpMessages()

撰写回答