AHK 用久以后,电脑里很容易出现一堆常驻脚本:热键脚本、剪贴板脚本、窗口增强脚本、鼠标增强脚本、办公辅助脚本。刚开始手动运行还行,后面就会想让它们开机自动启动。

开机启动本身不难,真正麻烦的是管理。脚本多了以后,托盘里全是绿色图标,哪个脚本在运行、哪个脚本已经加入启动、哪个脚本的热键是什么,很快就记不住了。

最简单的方法:启动文件夹

Windows 有一个当前用户的启动文件夹,AHK 里可以直接用 A_Startup 访问。只要把脚本或程序的快捷方式放进去,Windows 登录后就会自动运行。

#Requires AutoHotkey v1.1

MsgBox, % "当前用户启动文件夹:`n" A_Startup
Run, %A_Startup%

这个方法的优点是直观、安全、容易恢复。你不需要改注册表,也不需要研究任务计划程序。缺点是脚本多了以后,快捷方式也会多,托盘图标也会多。

一键加入或移除开机启动

下面这个例子会让你选择一个 .ahk.exe 文件。如果启动文件夹里已经有对应快捷方式,就删除;如果没有,就创建。

^!s::
FileSelectFile, target, 3, %A_ScriptDir%, 选择要设置开机启动的脚本, 脚本或程序 (*.ahk;*.exe)
if ErrorLevel
    return

SplitPath, target, fileName,,, nameNoExt
linkFile := A_Startup "\" nameNoExt ".lnk"

if FileExist(linkFile)
{
    FileDelete, %linkFile%
    MsgBox, 已取消开机启动:`n%fileName%
}
else
{
    SplitPath, target,, workDir
    FileCreateShortcut, %target%, %linkFile%, %workDir%
    MsgBox, 已加入开机启动:`n%fileName%
}
return

这种写法比手动拖快捷方式方便一点,也适合做成自己的“脚本管理工具”。

用托盘菜单查看启动项

如果启动文件夹里放了很多 AHK 脚本,我更建议再做一个管理脚本。这个管理脚本本身常驻托盘,右键菜单里列出启动文件夹的快捷方式,点菜单就打开目标文件所在目录。

StartupMap := {}
BuildStartupMenu()
return

BuildStartupMenu()
{
    global StartupMap
    StartupMap := {}

    Menu, Tray, NoStandard
    Menu, StartupList, DeleteAll

    Loop, Files, %A_Startup%\*.lnk
    {
        FileGetShortcut, %A_LoopFileFullPath%, target, workDir
        if ErrorLevel
            continue

        StartupMap[A_LoopFileName] := target
        Menu, StartupList, Add, %A_LoopFileName%, OpenStartupTarget
    }

    Menu, Tray, Add, 开机启动脚本, :StartupList
    Menu, Tray, Add, 打开启动文件夹, OpenStartupFolder
    Menu, Tray, Add, 退出, ExitThisApp
}

OpenStartupTarget:
target := StartupMap[A_ThisMenuItem]
SplitPath, target,, dir
Run, %dir%
return

OpenStartupFolder:
Run, %A_Startup%
return

ExitThisApp:
ExitApp

这里的 FileGetShortcut 很有用,它能从快捷方式里读出真正的目标路径。菜单显示的是快捷方式名称,脚本内部保存的是目标文件路径。

给每个脚本写一点说明

脚本多了以后,最大的问题不是启动,而是忘记它们做什么。我的习惯是在脚本开头写一个块注释,记录用途、热键和注意事项。

/*
用途:窗口增强脚本
热键:
  Ctrl+Alt+M 打开窗口菜单
  Ctrl+Alt+R 重载脚本
说明:
  这个脚本需要常驻,建议加入开机启动。
*/

; 后面写正式代码

管理脚本可以读取目标 .ahk 文件,把开头这段注释提取出来显示。

ShowScriptNotes(file)
{
    FileRead, text, %file%
    if RegExMatch(text, "s)/\*\s*(.*?)\s*\*/", m)
        MsgBox, 64, 脚本说明, % m1
    else
        MsgBox, 48, 脚本说明, 这个脚本没有写说明。
}

这不是什么高级技巧,但非常实用。尤其是你有十几个常驻脚本时,一段说明能省掉很多回忆成本。

什么时候用任务计划程序

启动文件夹适合普通脚本。如果脚本需要管理员权限、需要延迟启动、需要在特定条件下运行,就可以考虑 Windows 任务计划程序。任务计划程序更强,但也更重,不适合所有小脚本都往里塞。

我的建议是:

  • 普通常驻脚本:用启动文件夹快捷方式。
  • 需要统一入口:用托盘管理菜单。
  • 需要管理员权限或延迟启动:再考虑任务计划程序。
  • 脚本很多时:每个脚本开头写说明,管理脚本提供查看入口。

相关链接:调用Com组件添加计划任务自启

 

开机启动不是目的,能长期管理才是目的。不要让电脑一开机就跑一堆自己都记不清的脚本。启动项越多,越需要一个清楚的入口和说明。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。