用法
用下文中的代码创建 appkeyable.ahk 并用 AutoHotKey V1 打开,功能与这里类似:
CapsLock + 字母 --> 打开或切换到指定的程序窗口,若已是指定窗口则在窗口间循环切换
与 Alt+Tab 的区别:一次到位,指哪打哪,不需要再按多次来寻找需要的软件。
下载 appkeyable.tgz(内含已转为 appkeyable.exe 的 appkeyable.v3.ahk,可以不安装 AutoHotKey V1 直接运行)
代码
AutoHotKey 目前有 V1 和 V2 两个版本,可以同时安装两个版本。以下代码均为 AutoHotKey V1 版本,版本号:v1.1.37.01 U32。
第3版:
功能正常可用,在独立的配置文件中配置程序快捷键(适合 Ahk2Exe 后给其他人使用以防止将脚本损坏)。展示快捷键清单的帮助信息可自动生成,配置文件缺失时可自动生成。
启动脚本后会在脚本所在目录生成与脚本同名的 .ini 文件,参照注释配置后重新加载脚本(不需要退出,再次运行即可)即可开始使用。脚本改名后配置文件也需要手动同时修改。
; 用快捷键打开或切换到预定的软件窗口 ; 仅支持任务栏中有窗口的程序(不支持缩小后只存在于托盘的那些) #NoEnv #SingleInstance force #WinActivateForce #UseHook #InstallKeybdHook ;#NoTrayIcon ; 此行开头没有分号时可隐藏托盘区图标 SendMode Input global updatedAt := "20240222" global configFileName := RegExReplace(A_ScriptName, "\.\w+$", "") . ".ini" global configFile := A_ScriptDir . "\" . configFileName global applications := {} if !FileExist(configFile) { text = ( ;; 用逗号分隔3项:键, 进程名, 启动器路径及参数,逗号前后可以有空白,路径中不能出现非英文字符 ;; 双分号开头的行将被忽略 ;; CapsLock + / 已被用于显示帮助信息(/ 和 ? 同键位) ;; CapsLock + f 已被用于切换资源管理器窗口 ;; 配置示例: ;; c, chrome.exe, C:\Program Files\Google\Chrome\Application\chrome.exe ) FileAppend, %text%, %configFile% } Loop, Read, %configFile% { params := StrSplit(A_LoopReadLine, ",") ; 排除不足3项、以双分号开头、按键是“/”的行,“/”被绑给帮助窗口了 if(params.Length() < 3 or RegExMatch(A_LoopReadLine, "^\s*;;") or RegExMatch(A_LoopReadLine, "^\s*/")) continue hotkey := "Capslock & " . Trim(params[1]) function := Func("LaunchOrFocus").Bind({ select: "ahk_exe " . Trim(params[2]), run: Trim(params[3]) }) Hotkey, ~%hotkey%, % function applications[params[1]] := params[2] } Capslock & /::ShowAppShortcuts() Capslock & f::ActivateExplorerWindow() ;; 运行或切换到指定的程序窗口 LaunchOrFocus(configuration) { SetCapsLockState, On ; 关闭 CapsLock (即设为未亮灯状态;为什么是 On 而不是 Off?因为: 莫名地 Off 不能关闭,而 On 能关闭) selector := configuration["select"] if (selector and WinExist(selector)) { if (WinActive(selector)) { WinActivateBottom % selector } else { WinActivate } } else { Run % configuration["run"] WinWait % selector WinActivate % selector } } ;; 在打开的资源管理器窗口中切换 ActivateExplorerWindow() { IfWinNotExist, ahk_class CabinetWClass Run, explorer.exe WinActivateBottom ahk_class CabinetWClass } ;; 显示帮助信息 ShowAppShortcuts() { message := "" For key, value in applications { message := message . key . " -> " . value . "`n" } message := message = "" ? "请先在 " . configFile . " 中配置程序快捷键" : "用 CapsLock + {key} 打开这些程序:`n" . message MsgBox, 0, Help v%updatedAt%, % message, 30 SetCapsLockState, Off } ;; eof
第2版:
功能正常可用,在 .ahk 脚本内配置程序快捷键,添加快捷键后帮助信息需要手动更新。
; 功能说明:切换到(或打开)指定 app,如果已是指定 app 则在其窗口中循环切换 ; 代码参考: https://stackoverflow.com/questions/40435980/how-to-emulate-hyper-key-in-windows-10-using-autohotkey ; 防止 MS-OFFICE 意外被激活: REG ADD HKCU\Software\Classes\ms-officeapp\Shell\Open\Command /t REG_SZ /d rundll32 #NoEnv #UseHook #InstallKeybdHook #SingleInstance force #WinActivateForce SendMode Input ;SetCapslockState, AlwaysOff ;; remap capslock to hyper ;; if capslock is toggled, remap it to esc ~Capslock:: Send {Ctrl DownTemp}{Alt DownTemp}{RWin DownTemp} KeyWait, Capslock Send {Ctrl Up}{Shift Up}{Alt Up}{RWin Up} ; 单按 Capslock 改为 Esc ;if (A_PriorKey = "Capslock") { ; Send {Esc} ;} return ~Capslock & c::LaunchOrFocus({ run: "C:\Program Files\Google\Chrome\Application\chrome.exe", select: "ahk_exe chrome.exe" }) ~Capslock & v::LaunchOrFocus({ run: "C:\Users\IAIC\AppData\Local\Programs\Microsoft VS Code\Code.exe", select: "ahk_exe Code.exe" }) ~Capslock & f::LaunchOrFocus({ run: "C:\Users\IAIC\AppData\Local\Fork\Fork.exe", select: "ahk_exe Fork.exe" }) ~Capslock & e::LaunchOrFocus({ run: "P:\Applications\Notepad2\Notepad2_x64.exe", select: "ahk_exe Notepad2_x64.exe" }) ~Capslock & d::LaunchOrFocus({ run: "C:\Users\IAIC\AppData\Local\DBeaver\dbeaver.exe -nl zh", select: "ahk_exe dbeaver.exe" }) ~Capslock & a::LaunchOrFocus({ run: "C:\Program Files (x86)\DingDing\DingtalkLauncher.exe", select: "ahk_exe DingTalk.exe" }) ~Capslock & t::LaunchOrFocus({ run: "wt.exe", select: "ahk_exe WindowsTerminal.exe" }) ~Capslock & /::ShowApps() ShowApps() { MsgBox, 0, AppShortcuts, "͟Chrome ͟VSCode ͟Fork Not͟epad2 ͟Dbeaver ͟Terminal", 30 } LaunchOrFocus(app) { selector := app["select"] if (selector and WinExist(selector)) { if (WinActive(selector)) { WinActivateBottom % selector } else { WinActivate } } else { Run % app["run"] } SetCapsLockState, Off }
第1版:
用于测试可行性,未曾正式使用。
; 用“CapsLock + 字符”打开/切换到指定软件 ; via: https://stackoverflow.com/questions/40435980/how-to-emulate-hyper-key-in-windows-10-using-autohotkey #NoEnv ; recommended for performance and compatibility with future autohotkey releases. #UseHook #InstallKeybdHook #SingleInstance force SendMode Input ~Capslock:: Send {Ctrl DownTemp}{Alt DownTemp}{LWin DownTemp} KeyWait, Capslock Send {Ctrl Up}{Alt Up}{LWin Up} return ; 关闭 Office App 的快捷键“Win + Ctrl + Alt + Shift” ; REG ADD HKCU\Software\Classes\ms-officeapp\Shell\Open\Command /t REG_SZ /d rundll32 ; 打开/切换到指定软件 ; via: https://gist.github.com/realchrisolin/fb10b20c832acb7e54605980afd14836 RunOrActivate(Target, WinTitle = "", Parameters = "") { ; Get the filename without a path SplitPath, Target, TargetNameOnly Process, Exist, %TargetNameOnly% If ErrorLevel > 0 PID = %ErrorLevel% Else Run, %Target% "%Parameters%", , , PID ; At least one app (Seapine TestTrack wouldn't always become the active ; window after using Run), so we always force a window activate. ; Activate by title if given, otherwise use PID. If WinTitle <> { SetTitleMatchMode, 2 WinWait, %WinTitle%, , 3 TrayTip, , Activating Window Title "%WinTitle%" (%TargetNameOnly%) WinActivate, %WinTitle% } Else { WinWait, ahk_pid %PID%, , 3 TrayTip, , Activating PID %PID% (%TargetNameOnly%) WinActivate, ahk_pid %PID% } SetTimer, RunOrActivateTrayTipOff, 1 } ; Turn off the tray tip RunOrActivateTrayTipOff: SetTimer, RunOrActivateTrayTipOff, off TrayTip Return ; 为软件绑定快捷键 ~Capslock & v::RunOrActivate("C:\Users\usr\AppData\Local\Programs\Microsoft VS Code\Code.exe") ;"Visual Studio Code" ~Capslock & g::RunOrActivate("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe") ;"Google Chrome" ~Capslock & f::RunOrActivate("C:\Users\usr\AppData\Local\Fork\Fork.exe") ;"Fork"