当窗口焦点改变时,如何自动重新加载 AHK 脚本而无需按任何键来重新加载?

当窗口焦点改变时,如何自动重新加载 AHK 脚本而无需按任何键来重新加载?

-嗨,我刚接触 Autohotkey

  • 我使用 AHK V 1.1.36.02

  • 我总是使用此方法重新加载 AHK 脚本:

    ^r::重新加载

但我发现这种方法要求我每次编辑脚本时都按热键重新加载。

  • 知道 VS Code 自动在延迟后保存更改,是否有办法在窗口失去焦点时自动重新加载 AHK 脚本,而无需按任何键来重新加载它。

  • (我在其中编辑脚本的窗口(程序)是“VS Code”)示例:

  • 我在 VS Code 窗口中更改了脚本,然后切换到另一个窗口(另一个程序)或任何地方(桌面),我希望一旦 VS Code 窗口失去焦点,脚本就会自动重新加载,我不会按任何键来重新加载它。

  • 我尝试过这个方法,但是没有效果:

    #If not WinActive("ahk_exe Code.exe")
        Run, "C:\Users\th\AppData\Local\Programs\Microsoft VS Code\Code.exe"
    #If
    
  • 该脚本包含热键和热字符串

  • 有人能帮忙吗?我会很感激的,提前谢谢大家,抱歉我的英语不好,还有重复的问题,希望我的问题说清楚了。

答案1

这是这篇文章的主题 修改时自动重新加载 AutoHotkey 脚本

已接受 LogicDaemon 的回答 展示了如何设置脚本本身以检查它是否被修改,并在发生这种情况时重新加载自身。请注意,这里的技巧是成功重新加载将终止当前执行流程,因此很容易检测到重新加载失败。

在脚本开始附近的某个地方,在自动执行部分

#SingleInstance force
FileGetTime ScriptStartModTime, %A_ScriptFullPath%
SetTimer CheckScriptUpdate, 100, 0x7FFFFFFF ; 100 ms, highest priority

脚本中的任意位置(通常在底部某处):

CheckScriptUpdate() {
    global ScriptStartModTime
    FileGetTime curModTime, %A_ScriptFullPath%
    If (curModTime == ScriptStartModTime)
        return
    SetTimer CheckScriptUpdate, Off
    Loop
    {
        reload
        Sleep 300 ; ms
        MsgBox 0x2, %A_ScriptName%, Reload failed. ; 0x2 = Abort/Retry/Ignore
        IfMsgBox Abort
            ExitApp
        IfMsgBox Ignore
            break
    } ; loops reload on "Retry"
}

答案2

方法略有不同。还包含多次点击重新加载/退出键设置选项。

/*
Reload Script … …   Ctrl + HOME key rapidly clicked 2 times. 
Exit Script … … … … Ctrl + Escape key rapidly clicked 3 times.
*/
; … … … … … … … … … … … … … … … … … … … …  
SetKeyDelay, 250     ; Sets the TapCount allowed delay time (milliseconds) for script Exit.  (tied to Reload/Exit routine)
; … … … … … … … … … … … … … … … … … … … …  

/*
Auto-reload script upon changes:
  - If you make any changes to the script file and save it, the script will automatically reload itself and continue running without manual intervention.
*/

; … … … … … … … … … … … … … … … … … … … …  
; … … … … Place in Auto-Execute … … … … … …  
; … … … … … … … … … … … … … … … … … … … …  
#SingleInstance, Force 
#Persistent 
SetBatchLines -1 
DetectHiddenWindows, On          ; To detect script.
SetTimer, UpdateCheck, 500       ; Checks for script changes every 1/2 second. (Script Updater)
; … … … … … … … … … … … … … … … … … … … … 
; … … … … … … … … … … … … … … … … … … … …  



; … … … … … … … … … … … … … … … … … … … …  
; … … … … … …  Place Code Here  … … … … … … 
; … … … … … … … … … … … … … … … … … … … …  



; … … … … … … … … … … … … … … … … … … … …  
; … … … …  Place near script end  … … … … … …  
; … … … … … … … … … … … … … … … … … … … …  

UpdateCheck:                 ; Check if the script file has been modified.
    oldModTime := currentModTime
FileGetTime, currentModTime, %A_ScriptFullPath%

; … … … … If the modification timestamp has changed, reload the script.
    if  (oldModTime = currentModTime) Or (oldModTime = "")
        Return
Reload

; … … … … … … … … … … … … … … … … … … … …  
; … … … … … … … … … … … … … … … … … … … …  

RETURN

; … … … …  
; RELOAD
^Home::           ; … … Ctrl + [Home]
if (A_TimeSincePriorHotkey > 250) 
{
    TapCount := 1
    KeyWait, Esc
} else {
    TapCount++
    if (TapCount = 2)    ; <<<<---- Set TapCount to # of key taps wanted.
    {
    SoundBeep, 2200, 75
        Reload
} else {
        KeyWait, Esc
    }
}
Return

; … … … …  
; EXIT
^Esc::      ; … …  Ctrl + ([Esc] times (# of TapCounts))
if (A_TimeSincePriorHotkey > 250) 
{
    TapCount := 1
    KeyWait, Esc
} else {
    TapCount++
    if (TapCount = 3)    ; <<<<---- Set TapCount to # of key taps wanted.
    {
    SoundBeep, 2200, 75
        Gui, Destroy
        ExitApp
} else {
        KeyWait, Esc
    }
}
Return

; … … … … … … … … … … … … … … … … … … … …  
; … … … … … SCRIPT  END  … … … … … … … … …
; … … … … … … … … … … … … … … … … … … … …  

相关内容