当切换开/关时,循环未正确执行

问题描述 投票:0回答:1

目标:

运行ahk脚本以使窗口保持活动状态。当用户点击窗口时,它会立即再次激活。

这样就可以在游戏中使用叠加(被认为是自己的窗口),并且如果偶然点击叠加,则游戏窗口将再次成为活动窗口。

我还希望能够在游戏过程中打开和关闭它,以便用户可以在必要时使用alt + tab。

问题:

我正在测试我的代码实现,到目前为止我已将其设置为使空白的记事本文件成为活动窗口并保持活动状态。

问题是切换(ctrl + alt + J)。我可以关闭它的代码,但是当我在窗口上切换它时,它不会再次变为活动状态。

码:

stop := 0
; 0 = off, 1 = on

while (stop = 0)
{
    IfWinNotActive, Untitled - Notepad
        {
        WinActivate, Untitled - Notepad
        }
}

return

^!j::
    stop  := !stop

    if (stop = 0){
        MsgBox, stop is off.
    }
    else{
        MsgBox, stop is  on.
    }

return
autohotkey
1个回答
0
投票

切换后它不起作用的原因是While只运行直到计算结果为假。即使它后来评估的内容再次成为现实,它也不会重新启动。 以下是您可以使当前代码工作的方法:

stop := 0
; 0 = off, 1 = on

labelWinCheck: ; label for GoSub to restart while-loop
while (stop = 0)
{
    IfWinNotActive, Untitled - Notepad
    {
        WinActivate, Untitled - Notepad
    }
    Sleep , 250 ; added sleep (250 ms) so CPU isn't running full blast
}
return

^!j::
    stop  := !stop

    if (stop = 0){
        MsgBox, stop is off.
    } else {
        MsgBox, stop is on.
    }
GoSub , labelWinCheck ; restarts while-loop
return

我会通过几种不同的方式来实现您的目标。

  • 容易:使用SetTimer而不是While。
stop := 0
SetTimer , labelWinCheck , 250 ; Repeats every 250 ms

labelWinCheck:
If !WinActive( "Untitled - Notepad" )
    WinActivate , Untitled - Notepad
Return

^!j::
SetTimer , labelWinCheck , % ( stop := !stop ) ? "off" : "on"
MsgBox , % "stop is " . ( stop ? "on" : "off" )
Return
  • 高级:我们OnMessage()监控WinActivate事件。我没有这方面的工作示例,因为我需要对我进行一些研究,但这里有一个链接,用于我监控键盘事件的解决方案,Log multiple Keys with AutoHotkey。底部的链接可能特别有用。
© www.soinside.com 2019 - 2024. All rights reserved.