Python 局域网剪切板同步工具如何实现?

场景:使用远程桌面开发,远程电脑和本机能连接到同一个数据库,但不能通过远程桌面复制和粘贴。 通过数据库打通剪切板。实现来回复制。 GitHub: https://github.com/gaoice/python-tools

exe 版本 度盘: https://pan.baidu.com/s/1n5dIWXEC0Y3I5h6MzZ0tfw 提取码: uepi


Python 局域网剪切板同步工具如何实现?

1 回复

要搞个局域网剪切板同步工具,核心就是监听本地剪切板变化,然后通过Socket广播给局域网其他机器。下面这个实现用到了pyperclipsocket

import pyperclip
import socket
import threading
import time
from datetime import datetime

class ClipboardSync:
    def __init__(self, port=9999):
        self.port = port
        self.last_content = ""
        self.running = True
        
        # 创建UDP socket
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        self.sock.settimeout(0.1)
        
    def start(self):
        """启动剪切板同步"""
        # 启动监听线程
        listen_thread = threading.Thread(target=self._listen_clipboard)
        listen_thread.daemon = True
        listen_thread.start()
        
        # 启动接收线程
        receive_thread = threading.Thread(target=self._receive_broadcast)
        receive_thread.daemon = True
        receive_thread.start()
        
        print(f"剪切板同步已启动,监听端口 {self.port}")
        print("按 Ctrl+C 停止")
        
        try:
            while self.running:
                time.sleep(1)
        except KeyboardInterrupt:
            self.stop()
    
    def stop(self):
        """停止同步"""
        self.running = False
        self.sock.close()
        print("剪切板同步已停止")
    
    def _listen_clipboard(self):
        """监听本地剪切板变化"""
        while self.running:
            try:
                current_content = pyperclip.paste()
                
                # 如果内容发生变化且不是空字符串
                if (current_content != self.last_content and 
                    current_content.strip() != ""):
                    
                    self.last_content = current_content
                    self._broadcast_content(current_content)
                    
                    timestamp = datetime.now().strftime("%H:%M:%S")
                    print(f"[{timestamp}] 发送: {current_content[:50]}...")
                
                time.sleep(0.5)  # 降低CPU使用率
                
            except Exception as e:
                print(f"监听剪切板出错: {e}")
                time.sleep(1)
    
    def _broadcast_content(self, content):
        """广播剪切板内容到局域网"""
        try:
            message = f"CLIPBOARD:{content}"
            self.sock.sendto(message.encode('utf-8'), 
                           ('<broadcast>', self.port))
        except Exception as e:
            print(f"广播失败: {e}")
    
    def _receive_broadcast(self):
        """接收其他机器的广播"""
        receiver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        receiver.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        receiver.bind(('', self.port))
        
        while self.running:
            try:
                data, addr = receiver.recvfrom(65535)
                message = data.decode('utf-8')
                
                if message.startswith("CLIPBOARD:"):
                    content = message[10:]  # 去掉前缀
                    
                    # 避免回环(不设置自己发送的内容)
                    if content != self.last_content:
                        pyperclip.copy(content)
                        self.last_content = content
                        
                        timestamp = datetime.now().strftime("%H:%M:%S")
                        ip = addr[0]
                        print(f"[{timestamp}] 来自 {ip}: {content[:50]}...")
                        
            except socket.timeout:
                continue
            except Exception as e:
                print(f"接收数据出错: {e}")

if __name__ == "__main__":
    # 安装依赖: pip install pyperclip
    sync = ClipboardSync()
    sync.start()

工作原理:

  1. pyperclip 负责读取和设置系统剪切板
  2. UDP广播把剪切板内容发给局域网所有机器(端口9999)
  3. 每个实例既发送也接收,实现双向同步
  4. 通过时间戳和内容去重避免循环同步

运行方式: 在局域网每台电脑上运行这个脚本,需要先 pip install pyperclip。所有机器就能自动同步剪切板内容了。

简单说就是监听变化+网络广播。

回到顶部