在后台检测python中的按键

时间:2015-11-23 04:52:59

标签: python

我正在尝试找到一种方法来检测按键,然后根据它的键来运行方法。

我已经可以用Tkinter做到这一点。但我无法做到的是在窗口处于后台时检测按键。我将在玩游戏时在后台运行此程序。我需要它能够在游戏中检测输入。

有什么办法可以用Tkinter或其他东西做到这一点吗?我希望不必下载任何外部内容,因为我希望将其分发给其他人。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

从按键事件中获取所有属性。你可以做以下

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

答案 2 :(得分:0)

我建议不要再使用 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 可能是另一种值得考虑的替代方案。