用法
用下文中的代码创建 appkeyable.ahk 并用 AutoHotkey 打开,功能与这里类似:
CapsLock + 字母 --> 打开或切换到指定的程序窗口,若已是指定窗口则在窗口间循环切换
与 Alt+Tab 的区别:一次到位,指哪打哪,不需要再按多次来寻找需要的软件。
下载 AutoHotkey v1 版的 appkeyable.tgz(内含已转为 appkeyable.exe 的 appkeyable.v3.ahk,可以不安装 AutoHotkey V1 直接运行)
代码
第4版:
AutoHotkey v2:
; 用快捷键打开或切换到预定的软件窗口
; 仅支持任务栏中有窗口的程序(不支持缩小后只存在于托盘的那些)
;#NoEnv ; 不再需要,v2中是默认行为
#SingleInstance Force
#WinActivateForce
#UseHook
#InstallKeybdHook
;#NoTrayIcon ; 此行开头没有分号时可隐藏托盘区图标
SendMode("Input")
global updatedAt := "20250206"
global configFileName := RegExReplace(A_ScriptName, "\.\w+$", "") . ".ini"
global configFile := A_ScriptDir . "\" . configFileName
global applications := Map()
if !FileExist(configFile)
{
text := (
;; 用逗号分隔3项:键, 进程名, 启动器路径及参数,逗号前后可以有空白,路径中不能出现非英文字符
;; 双分号开头的行将被忽略
;; CapsLock + / 已被用于显示帮助信息(/ 和 ? 同键位)
;; CapsLock + f 已被用于切换资源管理器窗口
;; 配置示例:
;; c, chrome.exe, C:\Program Files\Google\Chrome\Application\chrome.exe --ash-enable-mirrored-screen
)
FileAppend(text, configFile)
}
for line in FileRead(configFile).Split("`n")
{
params := StrSplit(line, ",")
; 排除不足3项、以双分号开头
if (params.Length < 3 || RegExMatch(line, "^\s*;;"))
continue
hotkey := "Capslock & " . Trim(params[1])
function := LaunchOrFocus.Bind({ select: "ahk_exe " . Trim(params[2]), run: Trim(params[3]) })
Hotkey("~" . hotkey, function)
applications[Trim(params[1])] := Trim(params[2])
}
Hotkey("Capslock & /", ShowAppShortcuts)
Hotkey("Capslock & f", ActivateExplorerWindow)
; 运行或切换到指定的程序窗口
LaunchOrFocus(configuration) {
SetCapsLockState("On") ; 关闭 CapsLock
selector := configuration.select
if (selector && WinExist(selector)) {
if (WinActive(selector)) {
WinActivateBottom(selector)
} else {
WinActivate(selector)
}
} else {
Run(configuration.run)
WinWait(selector)
WinActivate(selector)
}
}
; 在打开的资源管理器窗口中切换
ActivateExplorerWindow(*) {
if !WinExist("ahk_class CabinetWClass")
Run("explorer.exe")
WinActivateBottom("ahk_class CabinetWClass")
}
; 显示帮助信息
ShowAppShortcuts(*) {
global applications, configFile, updatedAt
message := ""
for key, value in applications {
message := message . key . " -> " . value . "`n"
}
message := (message = "") ? ("请先在 " . configFile . " 中配置程序快捷键") : ("用 CapsLock + {key} 打开这些程序:`n" . message . "f -> 资源管理器`n/ -> 显示帮助`n")
MsgBox(0, "Help v" . updatedAt, message, 30)
SetCapsLockState("Off")
}
第3版:
AutoHotkey 目前有 V1 和 V2 两个版本,可以同时安装两个版本。以下代码(第3版、第2版、第1版)均为 AutoHotkey V1 版本,版本号:v1.1.37.01 U32。
20250206更新:帮助信息中增加了「f -> 资源管理器」和「/ -> 显示帮助」。
功能正常可用,在独立的配置文件中配置程序快捷键(适合 Ahk2Exe 后给其他人使用以防止将脚本损坏)。展示快捷键清单的帮助信息可自动生成,配置文件缺失时可自动生成。
启动脚本后会在脚本所在目录生成与脚本同名的 .ini 文件,参照注释配置后重新加载脚本(不需要退出,再次运行即可)即可开始使用。脚本改名后配置文件也需要手动同时修改。
; 用快捷键打开或切换到预定的软件窗口
; 仅支持任务栏中有窗口的程序(不支持缩小后只存在于托盘的那些)
#NoEnv
#SingleInstance force
#WinActivateForce
#UseHook
#InstallKeybdHook
;#NoTrayIcon ; 此行开头没有分号时可隐藏托盘区图标
SendMode Input
global updatedAt := "20250206"
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 . "f -> 资源管理器`n/ -> 显示帮助`n"
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"