我需要一种在纯Python代码中检测热键按下的方法。
我尝试使用我编写的代码片段:
import pynput
def on_press_keyboard(key):
try:
print('hold ' + str(key.char))
except AttributeError:
print('hold ' + str(key))
def on_release_keyboard(key):
try:
print('release ' + str(key.char))
except AttributeError:
print('release ' + str(key))
keyboard_listener = pynput.keyboard.Listener(on_press=on_press_keyboard, on_release=on_release_keyboard)
keyboard_listener.start()
keyboard_listener.join()
但是在 on_press_keyboard 函数中,当我同时按下多个键时,它会打印奇怪的,例如,这是我按 Ctrl+a 时的输出:
hold Key.ctrl_l
hold ☺
release ☺
release Key.ctrl_l
它印有笑脸??
我怎样才能让它正确地单独打印这些键,例如使其输出如下:
hold Key.ctrl_l
hold a
release a
release Key.ctrl_l
Hot-Key detected: Ctrl+a
我做了很多挖掘,这是我能找到的检测热键的最佳方法。
Pynput
几乎是不可能的,因为它会出现那些奇怪的字符。 Keyboard
的前景并不乐观,但您可以检测到 keyboard
中是否按下了热键。这是我想到的一个例子:
import keyboard
hotkeys = []
letters = 'abcdefghijklmnopqrstuvwxyz'
def on_press(hotkey):
print(f"You pressed a hotkey: {hotkey}")
for i in range(2):
for letter in range(26):
if i == 0:
hotkeys.append(("ctrl", letters[letter]))
else:
hotkeys.append(("alt", letters[letter]))
while True:
for hotkey in hotkeys:
if keyboard.is_pressed(f"{hotkey[0]}+{hotkey[1]}"):
on_press(f"{hotkey[0]} + {hotkey[1]}")
这是我能想到的最好的代码。首先,我们创建一个名为
hotkeys
的列表来存储所有可能的热键配对(我只做了 ctrl 和 alt)。接下来,我将它与字母表中的所有字母配对。如果需要,您可以添加更多可能的热键组合。该代码工作完美,但效率非常低,因为它需要代码检查大量热键组合,并且仅限于您决定放入列表中的热键数量。