将主控窗口上的键盘、鼠标操作实时同步到多个受控游戏窗口,实现"操作一个,全部跟随"。
想要直接使用?直接从 Releases 下载最新版本,例如 window_synchronizer_v0.1.0.zip。
- 同时运行多个相同游戏窗口,需要统一操控
- 目标游戏为 Win32 GDI 渲染(基于 Windows 消息机制处理输入)
- 窗口枚举 — 自动列出桌面所有可见窗口,显示进程名和标题
- 主控/受控选择 — 指定一个窗口为主控,勾选其余窗口为受控
- 键盘同步 — 主控窗口上的按键(含组合键)同步到所有受控窗口
- 鼠标同步 — 左键/右键/中键点击 + 拖拽 + 光标移动同步,支持跨窗口比例坐标映射
- 全局热键 —
Ctrl+Shift+S快速启停同步 - 窗口状态监控 — 窗口关闭时自动移除或停止同步
- Windows 10/11 (64-bit)
- Python 3.11+
- uv 包管理器
# 克隆项目
git clone <repo-url>
cd window_synchronizer
# 初始化环境并运行
uv sync
uv run python main.py- 启动程序,点击 刷新窗口列表 枚举桌面窗口
- 在列表中选择一个窗口,点击 设为主控
- 勾选需要同步的窗口(单击"同步"列或双击行)
- 点击 开始同步 或按
Ctrl+Shift+S启动 - 在主控窗口上进行操作,受控窗口自动跟随
- 再次点击 停止同步 或按
Ctrl+Shift+S停止
注意:1. 只有当前激活(前景)窗口为主控窗口时,键盘和鼠标事件才会被转发。在受控窗口或其他应用上的操作不会触发同步。2. Windows 系统设置-屏幕-缩放与布局需要设置为 100%。
window_synchronizer/
├── main.py # GUI 主界面 (tkinter)
├── sync_engine.py # 同步引擎 (Win32 钩子 + 消息转发)
├── theme.py # 主题配置 (tkinter 配置)
└── pyproject.toml # 项目配置 (uv)
┌──────────────────────────────────┐
│ main.py │
│ (tkinter GUI) │
│ 窗口列表 │ 控制面板 │ 状态栏 │
└──────────────┬───────────────────┘
│ 通知队列 (Queue)
┌──────────────▼───────────────────┐
│ sync_engine.py │
│ │
│ WH_KEYBOARD_LL ──► 按键转发 │
│ WH_MOUSE_LL ──► 点击/移动 │
│ RegisterHotKey ──► Ctrl+Shift+S │
│ │
│ PostMessageW ──► 受控窗口 │
└──────────────────────────────────┘
- 键盘钩子 (
WH_KEYBOARD_LL):捕获主控窗口按键 →PostMessageW转发WM_KEYDOWN/UP - 鼠标钩子 (
WH_MOUSE_LL):捕获点击/移动 →ScreenToClient坐标转换 →PostMessageW转发 - 热键:
RegisterHotKey+ 窗口过程子类化 →Ctrl+Shift+S启停 - 线程模型:钩子运行在独立后台线程;通知通过
Queue传递至主线程 UI
pip install pyinstaller
pyinstaller -D -w -i resources\icon.ico --add-data "resources\icon.ico:resources" -n window_synchronizer main.py参数说明:
-D:生成目录形式(启动更快)-w:无控制台窗口-i:指定图标-n:输出名称
