WinActivate 无法按预期工作.重新激活对起始窗口的焦点



我正在经历一些严重的挣扎,无法完全掌握激活窗口的控制并强制其焦点和最重要的位置。

为了调试一个更大的脚本,我制作了一个单独的脚本来测试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%的传统方式(请不要使用旧版(。

额外内容:
您不应该在热键语句中指定SetTitleMatchModeDetectHiddenWindows。没有必要(除非实际上有(每次点击热键时都设置这些。只需在脚本顶部指定一次即可。
不过,它们对你来说都没用,下面我将说明原因。此外,默认情况下,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

最新更新