AHK 写窗口脚本,最怕的不是命令不会用,而是窗口还没出现就开始操作、窗口没激活就发送按键、窗口标题变了导致匹配失败。WinWaitWinExistWinActive 是写稳定窗口脚本的基础三件套。

一、三者分别解决什么问题

命令/函数 作用 适合场景
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, 1000Send 稳定很多。因为不同电脑速度不同,固定 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 判断。
  • 发送按键前,用 WinActiveWinWaitActive 确认焦点。
  • 窗口标题不稳定时,优先使用 ahk_exe
  • 设置 SetTitleMatchMode, 2 后,记得标题匹配会变宽。

窗口脚本的稳定性,不在于写更多 Sleep,而在于每一步都知道窗口是否存在、是否激活、是否是你想操作的那个窗口。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。