AHK 新手脚本不稳定,很多时候不是命令写错,而是全局设置没想清楚。尤其是 SetTitleMatchModeCoordModeDetectHiddenWindows 这三个设置,看起来不起眼,却会直接影响窗口查找、鼠标坐标、图片识别和隐藏窗口判断。

一、SetTitleMatchMode:窗口标题怎么匹配

SetTitleMatchMode 决定 WinActivateWinWaitWinExist 等窗口命令如何匹配标题。如果你写 WinActivate, 记事本 有时找不到窗口,第一件事就该检查它。

#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force

SetTitleMatchMode, 2  ; 标题包含指定文本即可匹配

if WinExist("记事本") {
    WinActivate
} else {
    MsgBox, 没找到记事本窗口
}

常见模式里,1 表示标题开头匹配,2 表示标题包含匹配,3 表示标题完全匹配。日常脚本里,SetTitleMatchMode, 2 很常用,因为窗口标题经常会带文件名、网页标题或状态文字。

二、CoordMode:坐标到底相对谁

CoordMode 决定鼠标、像素、ToolTip、菜单等坐标是相对屏幕、窗口还是客户端区域。找图找色、点击坐标不准,很多时候就是 CoordMode 没统一。

CoordMode, Mouse, Screen
CoordMode, Pixel, Screen
CoordMode, ToolTip, Screen

MouseMove, 100, 100, 0
PixelGetColor, color, 100, 100, RGB
ToolTip, % "屏幕坐标 100,100 颜色:" color, 100, 130

如果脚本用的是全屏截图、全屏找图、全屏点击,建议把 Mouse 和 Pixel 都设为 Screen。否则你以为点的是屏幕坐标,AHKv1 实际默认是按窗口相对坐标系来解释坐标的,就会偏得很离谱。

三、DetectHiddenWindows:隐藏窗口算不算存在

DetectHiddenWindows 决定窗口命令是否能检测隐藏窗口。默认情况下,隐藏窗口通常不会被普通窗口命令找到。

DetectHiddenWindows, On

if WinExist("ahk_class AutoHotkey")
    MsgBox, 找到了隐藏或可见的 AHK 窗口
else
    MsgBox, 没找到

这个设置在控制后台脚本窗口、隐藏 GUI、托盘程序、某些辅助窗口时很有用。但也要注意,打开后可能匹配到你原本不想匹配的隐藏窗口,所以窗口条件要写得更准确。

四、这三个设置建议放在哪里

它们通常应该放在自动执行段,也就是脚本开头初始化区域。这样后面的热键、定时器、函数都在同一套规则下工作。

#NoEnv
#SingleInstance Force
SetTitleMatchMode, 2
CoordMode, Mouse, Screen
CoordMode, Pixel, Screen
DetectHiddenWindows, Off
return

F1::
MouseGetPos, x, y
MsgBox, % "当前屏幕坐标:" x ", " y
return

五、排查时先看全局设置

  • AHKv1 默认参数是按窗口相对坐标,可按需修改坐标系参考。
  • 窗口找不到:先看 SetTitleMatchMode 和窗口标题条件。
  • 点击位置不对:先看 CoordMode, Mouse
  • 找图找色偏移:先看 CoordMode, Pixel
  • 隐藏窗口找不到:先看 DetectHiddenWindows
  • 匹配到奇怪窗口:标题条件太宽,或者隐藏窗口被算进来了。

全局设置的特点是:它们不显眼,但影响范围很大。新手写脚本时,最好在开头就把这些规则写明白,不要让脚本在默认规则里碰运气。

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