我正在尝试找到一种方法来检测按键操作并根据按下的按键运行相应的方法。
使用Tkinter已经可以实现这个功能。但是,在窗口处于后台时,无法检测按键事件。我将在玩游戏时在后台运行此程序,需要它能够在我玩游戏时检测输入。
有没有办法使用Tkinter或其他方法来实现这一点?最好不要下载外部软件,因为我想把它分发给其他人。
我正在尝试找到一种方法来检测按键操作并根据按下的按键运行相应的方法。
使用Tkinter已经可以实现这个功能。但是,在窗口处于后台时,无法检测按键事件。我将在玩游戏时在后台运行此程序,需要它能够在我玩游戏时检测输入。
有没有办法使用Tkinter或其他方法来实现这一点?最好不要下载外部软件,因为我想把它分发给其他人。
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()
我建议不再使用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()
键盘 可以是另一个值得考虑的替代选择。
Esc
键,我的程序就会进入一种奇怪的状态,什么都不会打印。 - Daniel Duque要获取按键事件的所有属性,可以采取以下方法:
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
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()
pykeylogger
或pyhook
的工具。 - furas