如何在每次启动指定程序时自动向其发送AHK命令(无需手动按键)
如何在每次启动指定程序时自动向其发送AHK命令(无需手动按键)
嘿,我来帮你搞定这个问题!首先得指出你原来代码的核心问题:#If是用来定义热键/热字符串的上下文条件的,不是用来包裹普通执行代码的——你的代码结构错了,所以根本不会自动触发执行逻辑。
下面给你两种实用的解决方案,根据你的使用场景选就行:
方案一:通过AHK脚本直接启动程序并自动执行操作
如果你愿意把桌面快捷方式改成指向AHK脚本,这个方案最简单直接。脚本会自己启动目标程序,然后按顺序执行你的操作:
; 替换成你的Program.exe的实际路径,记得加引号 Run, "C:\你的程序路径\Program.exe" ; 等待程序窗口出现,超时10秒(可调整) WinWait, ahk_exe Program.exe, , 10 if ErrorLevel { MsgBox, 程序启动超时啦! ExitApp } ; 设置鼠标坐标以目标窗口为基准 CoordMode, Mouse, Window ; 给程序一点时间完全加载(根据程序启动速度调整Sleep时长) Sleep, 1000 ; 右键点击指定位置 ControlClick, x86 y143, ahk_exe Program.exe,, Right, 1 Sleep, 2000 ; 左键双击指定位置 ControlClick, x282 y130, ahk_exe Program.exe,, Left, 2 Sleep, 500 ; 发送文本(用SendInput比Send更可靠) SendInput, abcd ; 操作完成后可以退出脚本,也可以保留着看情况 ExitApp
使用方法:把脚本里的程序路径改成你实际的路径,然后把桌面的原程序快捷方式替换成指向这个AHK脚本的快捷方式,双击它就会自动完成所有操作。
方案二:后台监控程序启动,自动触发操作
如果你希望不管通过什么方式启动Program.exe(比如双击原快捷方式、其他程序调用),都能自动执行操作,就用这个后台监控的方案:
#Persistent ; 让脚本一直在后台运行 SetTimer, CheckProgramStatus, 1000 ; 每秒检查一次程序状态 CheckProgramStatus: ; 检查程序窗口是否存在 if WinExist("ahk_exe Program.exe") { ; 记录当前窗口ID,避免重复执行(比如程序重启时) currentWindowID := WinExist("ahk_exe Program.exe") if (currentWindowID != lastHandledWindowID) { lastHandledWindowID := currentWindowID ; 等待窗口激活就绪,超时10秒 WinWaitActive, ahk_exe Program.exe,, 10 if ErrorLevel { lastHandledWindowID := "" ; 重置,下次重新检查 return } CoordMode, Mouse, Window Sleep, 1000 ControlClick, x86 y143, ahk_exe Program.exe,, Right, 1 Sleep, 2000 ControlClick, x282 y130, ahk_exe Program.exe,, Left, 2 Sleep, 500 SendInput, abcd } } else { lastHandledWindowID := "" ; 程序关闭后重置ID } return
使用方法:运行这个脚本后,它会在后台默默监控。你可以把它加入开机启动,这样每次开机后都会自动生效。
几个重要的注意事项:
- 调整Sleep时长:不同程序的启动加载速度不一样,如果你发现操作执行时程序还没准备好,就适当增加
Sleep的数值(单位是毫秒)。 - 确认坐标准确性:用AHK自带的「Window Spy」工具(右键托盘区的AHK图标就能打开),可以精准获取目标窗口内的坐标,避免点错位置。
- 权限问题:如果你的Program.exe需要管理员权限运行,那AHK脚本也要右键选择「以管理员身份运行」,否则可能无法控制程序。
- SendInput更可靠:发送文本时优先用
SendInput,它比默认的Send速度更快、稳定性更强。
备注:内容来源于stack exchange,提问作者yfjuu 0
相关产品推荐
相关产品推荐

