Autohotkey多显示器下窗口最小化后恢复位置偏移问题
问题根因
你当前脚本的问题出在WinMove和WinMaximize的执行逻辑,以及系统对最大化窗口的位置缓存机制:
- 系统默认会为最大化窗口存储一套「还原状态坐标」,最小化后恢复时会优先读取这套缓存,你直接移动后最大化,没有正确更新系统层面的窗口还原坐标缓存,多显示器场景下就会回弹到主显示器
- 硬编码的固定坐标适配性差,如果你后续调整显示器排列参数会失效
修正后可生效的AHK脚本
; 启动第一个记事本并标记专属标题 Run, Notepad WinWait, ahk_class Notepad WinSetTitle, 左屏记事本 ; 先重置为还原状态再移动,确保更新系统的窗口位置缓存 WinRestore, 左屏记事本 WinMove, 左屏记事本,, -2304, 0, A_ScreenWidth, A_ScreenHeight WinMaximize, 左屏记事本 ; 启动第二个记事本并标记专属标题 Run, Notepad WinWait, ahk_class Notepad WinSetTitle, 右屏记事本 WinRestore, 右屏记事本 WinMove, 右屏记事本,, 1500, 0, A_ScreenWidth, A_ScreenHeight WinMaximize, 右屏记事本 ; 可选:添加窗口还原事件监听,永久避免坐标回弹 OnMessage(0x0112, "CheckWindowRestore") CheckWindowRestore(wParam) { if (wParam = 0xF120) { ; 0xF120对应窗口还原的系统消息码SC_RESTORE WinGetTitle, activeTitle, A if (activeTitle = "左屏记事本") { WinRestore, A WinMove, A,, -2304, 0 WinMaximize, A } else if (activeTitle = "右屏记事本") { WinRestore, A WinMove, A,, 1500, 0 WinMaximize, A } } }
关键修改说明
- 先执行
WinRestore再移动:确保你修改的是窗口的还原状态坐标,修改后再最大化,系统会自动把你设置的坐标存入还原位置缓存,恢复时就不会回弹 - 增加窗口还原事件监听:如果系统后续因为分辨率调整、显示器插拔重置了坐标,触发还原操作时会自动把窗口挪回对应位置
- 去掉了多余的窗口遍历和弹窗逻辑,直接针对两个标记后的记事本操作,执行效率更高
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

