我正在尝试找到一种方法来检测按键,然后根据它的键来运行方法。
我已经可以用Tkinter做到这一点。但我无法做到的是在窗口处于后台时检测按键。我将在玩游戏时在后台运行此程序。我需要它能够在游戏中检测输入。
有什么办法可以用Tkinter或其他东西做到这一点吗?我希望不必下载任何外部内容,因为我希望将其分发给其他人。
答案 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 可能是另一种值得考虑的替代方案。