在后台检测Python中的按键事件
我想找到一种方法,可以检测到按键,然后根据按下的是哪个键来执行一个方法。
我已经可以用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()