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%
(请不要使用旧方法)。
额外内容:
您不应在热键语句中指定 SetTitleMatchMode
和 DetectHiddenWindows
。每次按下热键时都不需要(除非确实有)设置它们。只需在脚本顶部指定一次。
不过,它们对您都没有用,下面我将说明原因。此外 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
我在完全掌握激活 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%
(请不要使用旧方法)。
额外内容:
您不应在热键语句中指定 SetTitleMatchMode
和 DetectHiddenWindows
。每次按下热键时都不需要(除非确实有)设置它们。只需在脚本顶部指定一次。
不过,它们对您都没有用,下面我将说明原因。此外 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