You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加GUI后AutoHotkey脚本中PixelSearch失效,求解决方案

解决AutoHotkey中GUI与PixelSearch冲突的问题

我来帮你搞定这个问题——你的PixelSearch失效的根源其实是GUI显示后自动成为了活动窗口,而AutoHotkey的PixelSearch默认会在当前活动窗口的范围内进行搜索。你创建的GUI里没有白色像素,哪怕屏幕其他区域有,自然会返回"Not Found"。

下面给你几个可行的解决思路,以及对应的代码修改方案:

方案1:让GUI显示时不抢占焦点(最简单的修复)

在Gui Show命令里添加NoActivate参数,这样GUI窗口只会显示在顶层,但不会抢走原窗口的焦点,PixelSearch就会继续在正确的屏幕区域执行搜索。

修改后的测试代码:

;Press P on keyboard to test
p::SearchPixels()
Esc::exitapp

SearchPixels(){
    ;Define Region
    TLX = 1104
    TLY = 373
    BRX = 1422
    BRY = 452
    SomeText := "Found"
    
    Gui,+AlwaysOnTop
    Gui, Add, Text, cLime, %SomeText%
    ; 添加NoActivate,避免GUI获取焦点
    Gui, Show, xCenter yCenter NoActivate
    
    PixelSearch, FoundX, FoundY, TLX, TLY, BRX, BRY, 0xFFFFFF, 3, Fast RGB
    if ErrorLevel {
        MsgBox Not Found
    } else {
        MsgBox %SomeText%
    }
    Gui, Destroy ; Destroy the GUI
    Return
}

方案2:明确指定PixelSearch搜索整个屏幕

如果你需要确保搜索范围始终是整个屏幕,不管当前活动窗口是什么,可以在PixelSearch命令中指定搜索桌面窗口:

; 在PixelSearch中添加ahk_class Shell_TrayWnd(桌面窗口类)作为WinTitle参数
PixelSearch, FoundX, FoundY, TLX, TLY, BRX, BRY, 0xFFFFFF, 3, Fast RGB, ahk_class Shell_TrayWnd

这个方法会强制PixelSearch在整个桌面区域搜索,完全不受GUI窗口的影响。

方案3:先执行搜索再显示GUI

如果你的GUI只是用来展示搜索结果,完全可以把GUI的创建和显示逻辑放到PixelSearch之后,这样搜索时GUI还不存在,自然不会干扰:

SearchPixels(){
    ;Define Region
    TLX = 1104
    TLY = 373
    BRX = 1422
    BRY = 452
    SomeText := "Found"
    
    ; 先执行搜索
    PixelSearch, FoundX, FoundY, TLX, TLY, BRX, BRY, 0xFFFFFF, 3, Fast RGB
    
    ; 再创建并显示GUI
    Gui,+AlwaysOnTop
    Gui, Add, Text, cLime, %ErrorLevel ? "Not Found" : SomeText%
    Gui, Show, xCenter yCenter
    
    if ErrorLevel {
        MsgBox Not Found
    } else {
        MsgBox %SomeText%
    }
    Gui, Destroy
    Return
}

循环场景的优化方案

如果你需要在循环中持续执行搜索,建议不要每次循环都创建和销毁GUI,而是一次性创建GUI,用GuiControl动态更新内容,这样效率更高,也能避免焦点问题:

toggle := false
; Press P to start/stop the search loop
p::
toggle := !toggle
if (toggle) {
    ; 一次性创建GUI
    Gui,+AlwaysOnTop
    Gui, Add, Text, cLime vSearchStatus, Searching...
    Gui, Show, xCenter yCenter NoActivate, Pixel Monitor
    ; 设置定时器,每100ms执行一次搜索
    SetTimer, RunSearch, 100
} else {
    SetTimer, RunSearch, Off
    Gui, Destroy
    MsgBox Search stopped
}
return

RunSearch(){
    TLX = 1104
    TLY = 373
    BRX = 1422
    BRY = 452
    
    PixelSearch, FoundX, FoundY, TLX, TLY, BRX, BRY, 0xFFFFFF, 3, Fast RGB
    if ErrorLevel {
        ; 更新GUI文本
        GuiControl,, SearchStatus, No white pixels found
    } else {
        GuiControl,, SearchStatus, Found at (%FoundX%, %FoundY%)
        ; 如果找到后需要停止循环,取消下面的注释
        ; SetTimer, RunSearch, Off
        ; Gui, Destroy
        ; MsgBox White pixel detected!
    }
}

Esc::exitapp

这个循环版本既保持了GUI的实时反馈,又不会干扰PixelSearch的正常执行。

内容的提问来源于stack exchange,提问作者Smashpoint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:01:22