WinActivate 没有按预期工作。 Re-activating 关注开头 window

WinActivate does not work as expected. Re-activating focus to the starting window

我在完全掌握激活 windows 和强制他们的焦点和最重要位置的控制方面遇到了一些严重的困难。

为了调试更大的脚本,我制作了一个单独的脚本来测试 WinActivate 的使用,我再次观察到令人沮丧的行为,因为它要么一起忽略了我定义的标题,要么以其他方式失败。在较小的测试脚本中,我只是要求在另一个操作后将触发热键的 window 设置为活动状态,特别是输入框

下面是简单的测试代码:

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

此代码无法正确激活启动 window。例如,我在一个空的记事本 window 中执行热键,在将空白提交到输入框中后,焦点在我的第二台显示器上变为记事本++。我第二次从记事本(或其他应用程序)中按下热键时,记事本不会失去焦点。在第三次执行中,我再次从记事本开始,在输入框出现后,我将焦点切换到另一个 window。我再次向输入框提交空白,但新的 window 仍然是焦点,记事本未激活或置于最前面的位置。

有人可以向我解释一下 WinActivate 是怎么回事吗?

我对制作 windows 脚本主机文件的意外结果也有类似的沮丧,我想我一定是在 windows 中遗漏了一些基本细节。

您正在尝试激活以文字 "startTitle".
开头的 window 您忘记(?)使用 % 输入表达式语法或使用引用变量的旧方法 %startTitle%(请不要使用旧方法)。

额外内容:
您不应在热键语句中指定 SetTitleMatchModeDetectHiddenWindows。每次按下热键时都不需要(除非确实有)设置它们。只需在脚本顶部指定一次。
不过,它们对您都没有用,下面我将说明原因。此外 DetectHiddenWindows 已默认关闭。

WinGetTitle 不适合用于此。你真正想要做的是通过使用例如获得你想要的 window 的 hwnd WinExist().
然后通过 hwnd 引用 window。比使用 window 标题要好得多,而且 不可能 匹配错误的 window。要通过其 hwnd 引用 window,您可以在 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