我正在经历一些严重的挣扎,无法完全掌握激活窗口的控制并强制其焦点和最重要的位置。
为了调试一个更大的脚本,我制作了一个单独的脚本来测试WinActivate 的使用,我再次观察到令人沮丧的行为,因为它要么一起忽略我定义的标题,要么以其他方式失败。在较小的测试脚本中,我只是要求在另一个操作(特别是输入框(之后将触发热键的窗口设置为活动状态
以下是用于测试的简单代码:
F10::
SetTitleMatchMode, 1
DetectHiddenWindows, Off
WinGetTitle, startTitle, A
msgbox % "Start Title = <" . startTitle . ">"
;WinActivate, startTitle
inputbox, mode, Test box, Testing,,260,160
sleep 500
WinActivate, startTitle
Return
此代码未正确激活启动窗口。例如,我在空记事本窗口中执行热键,在将空白提交到输入框中时,焦点在我的第二台显示器上变为记事本++。第二次从记事本(或其他应用程序(中按热键时,记事本不会失去焦点。在第三次执行中,我再次从记事本开始,在输入框出现后,我将焦点切换到另一个窗口。我再次向输入框提交空白,但新窗口仍然是焦点,记事本未激活或带到最重要位置。
有人可以向我解释一下WinActivate发生了什么吗?
我对制作 Windows 脚本主机文件的意外结果也有类似的挫败感,我想我一定在窗口中缺少一些基本细节。
您正在尝试激活一个以文字文本"startTitle"开头的窗口。
您忘记了(?(要么输入带有%
的表达式语法,要么使用引用变量%startTitle%
的传统方式(请不要使用旧版(。
额外内容:
您不应该在热键语句中指定SetTitleMatchMode
和DetectHiddenWindows
。没有必要(除非实际上有(每次点击热键时都设置这些。只需在脚本顶部指定一次即可。
不过,它们对你来说都没用,下面我将说明原因。此外,默认情况下,DetectHiddenWindows
已经关闭。
WinGetTitle
不好用于此目的。您真正想要做的是获取您想要的窗口的hwnd,例如WinExist()
.
然后通过其hwnd引用窗口。比使用窗口标题要好得多,而且不可能匹配错误的窗口。若要按窗口的 hwnd 引用窗口,请在 WinTitle 参数上指定ahk_id
后跟 hwnd。
最后,串联运算符.
是多余的。当然,您可能更喜欢使用它,但如果您不知道,可以将其排除在外。
这是您修改后的代码:
F10::
_HWND := WinExist("A")
MsgBox, % "Start hwnd = <" _HWND ">"
InputBox, mode, Test box, Testing,,260,160
Sleep, 500
WinActivate, % "ahk_id " _HWND
Return