我刚刚发现了pynput库,这正是我一直在寻找的。我的目标是捕获用户正在键入的键,每当捕获到特定的键序列时,我希望计算机将一个序列写入当前carret的位置。在那之后,我想再次捕获用户的密钥,直到出现另一个值得注意的序列。诸若此类。
问题是,Listener也考虑了keyboard.write()的模拟击键,这导致了一个无限循环,这在它第一次发生时很有趣,但我现在正在尝试摆脱它。
我的方法是在计算机完成输入后停止Listener并创建一个新的,但这个过程在第一次start_listener()调用后会变慢很多,而且我认为这并不是最优的。我已经没有更多的想法了,所以我希望有人能帮上忙。
到目前为止,我的代码如下:
import keyboard
from pynput.keyboard import Key, Listener
def on_press(key):
   stop_listener()
   keyboard.write("Hello", 0.05)
   start_listener()
def on_release(key):
    if key == Key.esc:
        return False
def start_listener():
    global listener
    listener = Listener(on_press=on_press, on_release=on_release)
    listener.start()
    listener.join()
def stop_listener():
    global listener
    listener.stop()
with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()发布于 2021-06-08 08:12:08
在我的Linux Mint上,我需要管理员权限才能运行keyboard,但是我可以使用pynput.keyboard.Controller和press()、release()、time.sleep()方法执行相同的操作
我使用全局变量paused = False来控制on_press应该何时运行代码,而不是停止和启动listenere。
from pynput.keyboard import Key, Listener, Controller
import time
keyboard = Controller()
def on_press(key):
    global paused  # inform function to assign new value to global variable (instead of creating local variable)
    
    if not paused:
        paused = True
        #keyboard.type("Hello")         # module pynput.keyboard.Controller
        for char in "Hello": 
            keyboard.press(char)    # pynput.keyboard.Controller
            keyboard.release(char)  # pynput.keyboard.Controller
            time.sleep(0.05)
        paused = False
def on_release(key):
    if not paused:
        if key == Key.esc:
            return False
# global variable with default value at start
paused = False
with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()在Linux Mint 20,Python 3.8.5,pynput 1.7.3上测试
https://stackoverflow.com/questions/67879004
复制相似问题