AHK 写窗口脚本,最怕的不是命令不会用,而是窗口还没出现就开始操作、窗口没激活就发送按键、窗口标题变了导致匹配失败。WinWait、WinExist、WinActive 是写稳定窗口脚本的基础三件套。
一、三者分别解决什么问题
| 命令/函数 | 作用 | 适合场景 |
|---|---|---|
| WinWait | 等待窗口出现 | Run 后等程序打开、等弹窗出现 |
| WinExist | 判断窗口是否存在 | 分支判断、避免重复打开程序 |
| WinActive | 判断窗口是否处于活动状态 | 发送按键前确认焦点 |
它们常常一起用:先启动程序,等待窗口出现,确认窗口存在,再激活窗口,最后确认窗口已经激活。
二、Run 后不要立刻 Send
#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
SetTitleMatchMode, 2
Run, notepad.exe
WinWait, 记事本,, 3
if ErrorLevel {
MsgBox, 3 秒内没有等到记事本窗口。
return
}
WinActivate, 记事本
WinWaitActive, 记事本,, 2
if ErrorLevel {
MsgBox, 记事本窗口存在,但没有成功激活。
return
}
SendInput, AHK 窗口脚本测试
这比 Run 后直接 Sleep, 1000 再 Send 稳定很多。因为不同电脑速度不同,固定 Sleep 不是可靠等待。
三、WinExist:避免重复打开
SetTitleMatchMode, 2
if WinExist("记事本") {
WinActivate
} else {
Run, notepad.exe
WinWait, 记事本,, 3
if !ErrorLevel
WinActivate
}
WinExist() 不只是判断,它还会把最后找到的窗口设为默认窗口。后面紧跟 WinActivate 时,可以省略窗口标题。
四、WinActive:发送前最后确认
if !WinActive("ahk_exe notepad.exe") {
WinActivate, ahk_exe notepad.exe
WinWaitActive, ahk_exe notepad.exe,, 2
}
if WinActive("ahk_exe notepad.exe")
SendInput, 只在记事本激活时发送
else
MsgBox, 目标窗口没有激活,取消发送。
窗口自动化里,最危险的错误就是把按键发到了错误窗口。发送前用 WinActive 再确认一次,能避免很多误操作。
五、窗口条件尽量写准
能用 ahk_exe 就不要只靠模糊标题;能用 ahk_class 辅助就更稳。标题适合人读,但程序名和窗口类更适合脚本判断。
; 标题可能变化 WinActivate, 记事本 ; 程序名更稳定 WinActivate, ahk_exe notepad.exe ; 有些软件还可以加 ahk_class WinActivate, ahk_class Notepad
六、推荐套路
- 启动程序后,用
WinWait,不要只靠 Sleep。 - 可能已经打开的程序,先用
WinExist判断。 - 发送按键前,用
WinActive或WinWaitActive确认焦点。 - 窗口标题不稳定时,优先使用
ahk_exe。 - 设置
SetTitleMatchMode, 2后,记得标题匹配会变宽。
窗口脚本的稳定性,不在于写更多 Sleep,而在于每一步都知道窗口是否存在、是否激活、是否是你想操作的那个窗口。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)