python使用pynput实现划词复制

参考博客

Windows系统环境下Python脚本实现全局“划词复制”功能 - 缘起花渊 - 博客园 (cnblogs.com)https://www.cnblogs.com/yqmcu/p/11227206.htmlpynput库的官方文档

pynput Package Documentation — pynput 1.7.6 documentationicon-default.png?t=M3K6https://pynput.readthedocs.io/en/latest/​​​​​​​参考的博客实现了划词复制,但是看了下他的代码写的有点复制混乱,监听准确率并不高且不太容易理解。

实际监听鼠标的划词操作逻辑很简单:

记录下鼠标左键按下时的位置,当鼠标左键松开时,记录下鼠标左键松开的位置,如果按下的位置和松开的位置不一致,说明鼠标正在划词。

from pynput.mouse import Listener, Button
from pynput.keyboard import Key, Controller

class AutoCopier():
    __press_xy = (0, 0)  # 私有变量 鼠标左键按下时的位置

    def __init__(self):
        self.keyboard = Controller()                     # 初始化键盘控制器
        self.listener = Listener(on_click=self.on_click) # 初始化鼠标监听器
        self.listener.start()                            # 开启鼠标监听器线程

    # 点击函数
    def on_click(self, x, y, button, pressed):           
        if button == Button.left:             # 左键点击
            if pressed:                       # 左键按下
                self.__press_xy = (x, y)      # 记录当前鼠标位置
            else:                             # 左键松开           
                if self.__press_xy != (x, y): # 按下位置和松开位置不一致
                    self.copy()               # 说明操作是划词,执行复制函数
    
    # 复制函数
    def copy(self): 
        with self.keyboard.pressed(Key.ctrl): # 按下ctrl,with语句结束后自动松开
            self.keyboard.press('c')          # 按下c
            self.keyboard.release('c')        # 松开c

    # 等待线程终止
    def wait_to_stop(self):
        self.listener.join()

# for test
if __name__ == '__main__':
    at = AutoCopier()
    at.wait_to_stop()

你可能感兴趣的