python 有没有什么方法可以检测以编程方式执行的按键?

9rbhqvlz  于 2022-12-25  发布在  Python
关注(0)|答案(2)|浏览(106)

我想检测一个按键是否是以编程方式执行的(而不是用户的物理按键)。有什么方法可以做到吗?

import mouse
import keyboard
import time

keyboard.press("a")

if keyboard.is_pressed('a'):
    print ("pressed")

我假设上面的代码中的“is_pressed”只检测用户的实际输入,因此它不会显示打印(“pressed”)。我所能想到的解决这个问题的方法是下面的代码,它对我的意图很好,但我想知道是否有更好的优化方法。

import mouse
import keyboard
import time
    
    
keyboard.press("a")
keyboard_a = True

keyboard.press("b")
keyboard_b = True
    
if keyboard_a:
    print ("a pressed")

if keyboard_b:
    print ("b pressed")
qhhrdooz

qhhrdooz1#

无法区分以编程方式触发的按键事件和由用户输入触发的按键事件。readcharmsvcrtkeyboard库也是如此。
因此,该库提供了一种检测和响应按键事件的方法,而不管其来源如何。因此,使用标记的方法是好的。
我不知道您的确切目标,但也许您更喜欢使用send和这样的register事件

import keyboard

is_programmatic = False

# Define a function to be called when a specific key is pressed
def on_key_press(key):
    global is_programmatic

    if key == 'a':
        if is_programmatic:
            print("Key press event triggered programmatically")
        else:
            print("Key press event triggered by user input")
    
        is_programmatic = False

# Register listener
keyboard.on_press(on_key_press)
# Start keyboard listener
keyboard.wait()

并发布事件

is_programmatic = True
keyboard.send("a")
tct7dpnv

tct7dpnv2#

您可以创建一个列表并将按下的键存储在该列表中。您可以通过搜索该列表来查找是否按下了某个键。

import keyboard

key_pressed = []

keyboard.press("a")
key_pressed.append("a")

keyboard.press("b")
key_pressed.append("b")

keyboard.press("c")
key_pressed.append("c")

#check if a specific key is pressed
if "a" in key_pressed:
    print ("a pressed")

打印所有按下的键:

for key in key_pressed:
    print(key,'pressed')

打印最后按下的键:

print(key_pressed[-1])

您还可以创建一个类以使其更易于用途:

import keyboard
class CustomKeyboard():
    def __init__(self):
    self.pressed_keys = []

def press(self, key):
    keyboard.press(key)
    self.pressed_keys.append(key)

def is_pressed_programmatically(self, key):
    if key in self.pressed_keys:
        return True
    return False

然后像这样使用它:

kb = CustomKeyboard()

kb.press('a')
kb.press('b')

print("did a pressed programmatically?:")
print(kb.is_pressed_programmatically('a'))

print("did z pressed programmatically?:")
print(kb.is_pressed_programmatically('z'))

下面是输出:
是否以编程方式按下?:真的
是否通过编程方式按下z?:假

相关问题