Autohotkey 中文论坛

完整版: WinWaitClose和WinHide冲突?PortableApp制作过程中发现的问题
你目前正在浏览的是简化版. 请点击这里浏览完整版
我想做一个Portable Firefox。实现的功能就是指定Profile文件夹、在程序退出后退出脚本以及
通过热键隐藏显示FF主窗口。

单独实现前面两个功能的时候,脚本一切正常。代码是这样的:

Code1:
代码:
Run "%A_ScriptDir%\App\Firefox.exe" -Profile "%A_ScriptDir%\Data\Profiles", "%A_ScriptDir%\App\Mozilla Firefox\", Max
WinWait, ahk_class MozillaUIWindowClass

WinGet, v_WindowPID, PID

WinWaitClose
ExitApp
之后,我尝试添加了隐藏、显示主窗口的功能。修改后的代码如下:

Code2:
代码:
v_WindowVisible = y

Run notepad.exe
WinWait, ahk_class Notepad

WinGet, v_WindowPID, PID

WinWaitClose
ExitApp

#z::
if v_WindowVisible = y
{
        v_WindowVisible = n        
        WinHide, ahk_pid %v_WindowPID%
} else
{
        v_WindowVisible = y
        WinShow, ahk_pid %v_WindowPID%
}
return
问题来了:热键隐藏主窗口的时候,程序正常隐藏,脚本却退出了。

排查之后发现,只要不写WinWaitClose那一句,就不会退出。

现在想要请教大家,问题原因是不是WinWaitClose与WinHide存在冲突?(将WinHide认为Window已经Close?)如何解决?
如果这个冲突无法避免,我应该如何修改脚本实现需求的功能呢?

[ 本帖最后由 uian 于 2009-4-10 12:33 编辑 ]
在脚本的第一句 加上:
DetectHiddenWindows On
谢谢BLooM2,打开隐藏窗口探测后,脚本终于工作正常了。

下面附上正常工作的脚本代码。

如下:
代码:
SetTitleMatchMode RegEx                    ;开启正则表达式匹配标题字串
DetectHiddenWindows On                    ;开启隐藏窗体探测
Menu, Tray, NoStandard                    ;去除标准托盘菜单
v_WindowVisible = y

Run "%A_ScriptDir%\App\Firefox.exe" -Profile "%A_ScriptDir%\Data\Profiles", "%A_ScriptDir%\App\", Max
WinWait, Firefox$ ahk_class MozillaUIWindowClass    ;多重条件选择窗口,防止ThunderBird等Mozilla程序干扰窗口选定

WinGet, v_ID, ID                    ;查询ahk_id。
                            ;曾经尝试ahk_pid,发现脚本可以正常找到窗口,pid也正确
                            ;但是WinHide就是无法生效。替换为ahk_id后,才工作正常

WinWaitClose
ExitApp


#/::                ; Win + /,隐藏、显示主窗口的热键
if v_WindowVisible = y
{
    v_WindowVisible = n    
    WinHide, ahk_id %v_ID%
} else
{
    v_WindowVisible = y
    WinShow, ahk_id %v_ID%
}
return
参考网址