如何检测运行中的AutoHotkey脚本修改并实现自动重载?
无需循环实现AutoHotkey脚本文件变更自动重载(针对Google Drive同步文件夹)
可以利用Windows原生的**目录变更通知API(ReadDirectoryChangesW)**实现无循环的文件变更监听,它会在目标目录内的文件发生修改时主动触发通知,完全不需要轮询循环。以下是具体实现方案:
核心思路
Google Drive同步后,远程修改的文件会同步到本地机器的对应文件夹,此时Windows文件系统会检测到文件变化。通过调用ReadDirectoryChangesWAPI,我们可以异步监听这个文件夹的文件修改事件,当目标AHK脚本被更新时,自动重启脚本完成重载。
实现代码(AHK v1)
; 替换为你的Google Drive中AHK脚本的实际路径 TargetScript := "C:\Users\YourAccount\Google Drive\MyAutoHotkeyScript.ahk" ScriptDir := TargetScript "\.." ; 提取脚本所在目录 ; 打开目标目录以获取监控句柄 hDir := DllCall("CreateFile" , "Str", ScriptDir , "UInt", 0x80000000 ; GENERIC_READ , "UInt", 0x00000007 ; FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE , "Ptr", 0 , "UInt", 3 ; OPEN_EXISTING , "UInt", 0x02000000 ; FILE_FLAG_BACKUP_SEMANTICS(用于打开目录) , "Ptr", 0 ) if (hDir = -1) { MsgBox, 无法打开目标目录进行监控! ExitApp } ; 初始化监控缓冲区,设置监听事件:文件修改、文件名变更 BufferSize := 1024 VarSetCapacity(Buffer, BufferSize, 0) DllCall("ReadDirectoryChangesW" , "Ptr", hDir , "Ptr", &Buffer , "UInt", BufferSize , "UInt", 0 ; 不监控子目录 , "UInt", 0x00000002 | 0x00000004 ; FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME , "PtrP", BytesReturned , "Ptr", 0 , "Ptr", 0 ) ; 注册目录变更消息的处理回调 OnMessage(0x004A, "HandleDirChange") ; WM_DIR_NOTIFY 消息 HandleDirChange(wParam, lParam) { global TargetScript ; 解析返回的变更数据 Offset := 0 Loop { ; 获取变更的文件名 FileName := StrGet(&Buffer + Offset + 48, "UTF-16") if (FileName = "") break ; 检查是否是目标脚本文件 TargetFileName := SubStr(TargetScript, InStr(TargetScript, "\", 0, 0) + 1) if (FileName = TargetFileName) { ; 重载脚本:关闭当前实例,启动新的脚本 Process, Close, %A_ScriptName% Run, %TargetScript% ExitApp } ; 移动到下一条变更记录 Offset += NumGet(Buffer + Offset, 0, "UInt") } } ; 保持脚本后台运行 Persistent
关键说明
- API调用逻辑:
ReadDirectoryChangesW会异步监听目录变化,当事件发生时,系统会发送WM_DIR_NOTIFY消息,由我们注册的回调函数处理。 - Google Drive同步适配:由于Google Drive是异步同步,远程修改的文件需要等待同步完成后才会触发本地文件系统的变更事件,这个延迟由同步速度决定。
- 脚本重载方式:通过关闭当前脚本实例并重新启动目标脚本实现重载,确保运行的是最新版本。
- AHK v2适配:如果使用AHK v2,只需调整语法(比如
VarSetCapacity改为Buffer := BufferAlloc(1024),OnMessage的写法略有不同),核心API调用逻辑一致。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

