在后台检测Python中的按键操作

15

我正在尝试找到一种方法来检测按键操作并根据按下的按键运行相应的方法。

使用Tkinter已经可以实现这个功能。但是,在窗口处于后台时,无法检测按键事件。我将在玩游戏时在后台运行此程序,需要它能够在我玩游戏时检测输入。

有没有办法使用Tkinter或其他方法来实现这一点?最好不要下载外部软件,因为我想把它分发给其他人。


你是想要像键盘记录器一样检测所有的键盘活动,还是只是想要通过按下单个键来再次将程序置于前台?如果是后者,你可以尝试使用桌面环境的热键配置来实现。 - tdelaney
Autokey是一个检测按键并运行脚本的程序。它是用Python编写的。请查看其源代码,特别是IOMediator类 - https://code.google.com/p/autokey/source/browse/trunk/src/lib/iomediator.py - furas
2
操作系统不会将按键事件发送给后台程序,因此您需要类似于 pykeyloggerpyhook 的工具。 - furas
这是在哪个平台上? - poolie
4个回答

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

2
这个有没有 Ubuntu 的替代品? - SL5net

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

键盘 可以是另一个值得考虑的替代选择。


我陷入了一个无限循环。我如何只监听第一次按键?如果我按下 Esc 键,我的程序就会进入一种奇怪的状态,什么都不会打印。 - Daniel Duque

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接