我正在尝试使用Python来代替AutoHotkey。我已经设置了 pynput 来监听按键,并且大部分内容都按照我的预期工作。但是,我有一个问题,如果我通过监听键盘并在按键上执行某些操作来“重新绑定”一个键,它仍然会发送原始命令。我不了解 DirectInput 幕后的事情,更不用说其上的所有层了,所以很难解释我的问题。
我想要的示例(将 F3“重新绑定”到鼠标单击):
Press F3
Mouse click input is sent
发生情况的示例:
Press F3
F3 input is sent
Mouse click input is sent
如何防止发送多余的密钥,从而只发送我的“反弹”操作?
当您使用
pynput
设置键盘监听器时,您应该能够设置 suppress = True
;来自文档:
suppress (bool) – 是否抑制事件。将其设置为 True 将阻止输入事件传递到系统的其余部分。
例如,不要使用文档中的示例代码:
# Collect events until released
with keyboard.Listener(
on_press=on_press,
on_release=on_release) as listener:
listener.join()
您可以通过这种方式修改它以阻止事件传递到系统的其余部分:
# Collect events until released
with keyboard.Listener(
suppress=True,
on_press=on_press,
on_release=on_release) as listener:
listener.join()
请注意,没有选项可以仅阻止某些键,因此如果您想阻止热键并允许其他键通过,您可能需要在
on_press
回调中设置默认情况,通过按相同的键来通过密钥与刚刚通过您用来“重新绑定”热键的相同类型的 keyboard.Controller
机制注册。
from pynput import keyboard # 1
def on_key_press(key): # 2
print(f'Key {key} pressed') # 3
listener = keyboard.Listener(on_press=on_key_press) # 4
import keyboard # 4.1
keyboard.block_key('a') # 4.2
listener.start() # 5
listener.join() # 6
此代码捕获所有按下的键,并防止键“a”影响除此 Python 应用程序之外的任何其他应用程序。