首页 » 操作系统 » Windows » 正文

Windows 一键打开/切换到 App(替代 Alt + Tab)

发布者:站点默认
2020/07/20 浏览数(723) 分类:Windows Windows 一键打开/切换到 App(替代 Alt + Tab)已关闭评论

用法

用下文中的代码创建 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"

macOS 一键打开/切换到 App(替代 Cmd + Tab)

点击返回顶部
  1. 留言
  2. 联系方式