-嗨,我刚接触 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 … … … … … … … … …
; … … … … … … … … … … … … … … … … … … … …