我将全局 Windows 快捷键分配给了几个不同的 cmd.exe 实例。我通过在桌面上创建 cmd.exe 的快捷方式并为每个快捷键分配一个唯一的快捷键(例如,CTRL + SHIFT + U)来实现这一点。非常基本的东西。我使用的是 Win2K8(R1 和 R2)。
大多数情况下,这都可以正常工作。但令人恼火的是,有时它却不行。或者需要很长时间(很多秒)才能正常工作。哪个应用程序当前具有焦点并不重要(它甚至可以是命令提示符之一)。我分配了哪些键并不重要(我尝试了 WIN、CTRL 和 SHIFT 的几个变体)。我确实注意到,这通常(但并非总是)与 explorer.exe 以某种方式挣扎有关(例如,打开的资源管理器窗口指向不可用的文件共享,或者应用程序没有响应,等等)。换句话说,快捷键处理似乎对不相关的系统活动非常敏感。请注意,每当我遇到这个问题时,我总是可以成功地按 ALT + TAB 进入我想要的窗口,但这很乏味。
我每天都会使用这些命令窗口的快捷方式数百次,因此即使是 1% 的失败率也会变得非常烦人。
有没有办法解决这个问题,或者是否有一些第三方实用程序可以可靠地拦截自定义组合键,以便将焦点放在我想要的任何应用程序上,并且不依赖于其他系统活动?
附录:
如果切换到第三方热键工具,我并不想丢失 Windows 快捷方式的一个属性:Windows 快捷方式是幂等的。 一旦你启动了某个应用程序的快捷方式,再次按下快捷键组合就会带你回到已经启动的进程——确实如此不是启动一个新流程。
答案1
使用 Autohotkey。该脚本语言是非标准的,可能很难学习,但如果您只想可靠地启动程序,那么它很简单。此外,您还可以根据 Windows 键设置快捷方式!使用以下示例脚本并根据您的需要进行修改。(以 开头的行;
是注释。)
;win + alt + e ... unload ipod
#!E::
run d:\Downloads\Apps\deveject\eject ipod.bat
return
;win + w ... launch winamp
#w::
run c:\program files (x86)\winamp\winamp.exe
return
;win + a ... launch AS400
#a::
run C:\Program Files (x86)\IBM\Client Access\Emulator\Private\1.ws
return
;win + Shift a ... launch AS400 Printer
#+a::
run C:\Program Files (x86)\IBM\Client Access\Emulator\Private\3.ws
return
;win + ctrl + Shift a ... launch 2nd AS400
#^+a::
run C:\Program Files (x86)\IBM\Client Access\Emulator\Private\2.ws
return
将其保存为桌面上的 .ahk 文件,安装自动热键并运行它。
每次按下任何组合键时,AutoHotkey 都会扫描此脚本。如果它与 之前的任何组合键匹配::
,它将执行下一个命令。如果缺少 return 语句,AHK 将在执行语句后继续扫描脚本以查找匹配项。组合键如下所述。
# = Windows Key
+ = Shift
^ = Control
! = Alt
您可以将这些与键盘上的字母任意组合使用。我发现一个非常有用的组合如下。
; ALT Backtick ... ctrl f4
!`::
Loop, parse, RcvCtrlW, `,
{
IfWinActive %A_LoopField%
{
sendinput ^w
Return
}
}
sendinput ^{f4}
return
; win Backtick ... alt f4
#`::
sendinput !{f4}
return
这是 Alt + ` 和 Win + `。当此脚本运行时,我按下 alt + `,脚本会发送 ctrl + F4。Win + ` 变成 alt + F4。
Autohotkey 基本上是它自己的编程语言。我设置了脚本来模拟整个系统的“摇杆手势”。我的电子邮件有类似 GMail 的快捷方式。如果你花时间学习它的一些技巧,你就可以玩得开心。Lifehacker 有很多有用的脚本适用于 Autohotkey。玩得开心!
答案2
以下是我的使用方法自动热键以符合你的方式幂等要求。
举例来说,我已将Caps Lock
+挂接a
到 Stack Overflow 上的 Firefox 窗口,Caps Lock
将 +s
挂接到超级用户的 Firefox,并将Caps Lock
+d
挂接到命令提示符。
StartOrToggleMinimize(TheWindowTitle,TheAppPath)
{
SetTitleMatchMode, 2
DetectHiddenWindows, Off
IfWinActive, %TheWindowTitle%
{
WinMinimize, %TheWindowTitle%
}
else
{
IfWinExist, %TheWindowTitle%
{
WinGet, winid, ID, %TheWindowTitle%
DllCall("SwitchToThisWindow", "UInt", winid, "UInt", 1)
}
else
{
run %TheAppPath%
}
}
return
}
; the actual hotkeys:
CapsLock & a::StartOrToggleMinimize("Stack Overflow", "c:\program files\mozilla firefox\firefox.exe -new-window stackoverflow.com")
CapsLock & s::StartOrToggleMinimize("Super User", "c:\program files\mozilla firefox\firefox.exe -new-window superuser.com")
CapsLock & d::StartOrToggleMinimize("cmd", "cmd")
你可以更改标题匹配模式尽可能严格。如果我有另一个与“Mozilla Firefox”(而不是“超级用户”)匹配的热键,它将循环遍历我的所有 Firefox 实例,因为每个实例的窗口标题中都有该文本,并且我已将其设置为与标题中任何位置的文本匹配。
该脚本主要基于LifeHacker 上的这篇文章。
答案3
还有另一种快速直观地启动程序的方法:
Launchy 是一款免费的 Windows 和 Linux 实用程序,旨在帮助您忘记开始菜单、桌面上的图标甚至文件管理器。
Launchy 会索引您开始菜单中的程序,并且只需按几次键即可启动您的文档、项目文件、文件夹和书签!
答案4
它并不是不相关的活动,explorer是处理这些快捷方式的进程。
有实用程序(例如http://www.vsisystems.com/keyboardshortcuts.htm) 声称具有此功能,但我不知道它们是否能解决速度问题。