5

你如何让你的 alt+tab 功能像 OSX 一样工作,它使用 meta+tab 而不是 alt+tab,同时还尊重 shift 键?

我有解决方案。请注意这篇文章的日期,因为在弄清楚这一点之前,我已经经历了许多明显过时的解决方案。我在这个问题上总共工作了大约 4 个小时,并且遇到了很多不起作用的解决方案。我是 10 年的专业开发人员,但这个问题几乎要了我的命。

4

3 回答 3

4

有一个特殊的关键字来复制Alt + Tab功能。

我还意识到 AutoHotkey 会阻止键盘信号,直到您通过释放所有键完成快捷方式,因此在我按住控制键时发送的任何其他选项卡都会被忽略。

是的,它就是这样做的。热键创建了他们称之为“线程”的东西,默认情况下只能有一个。因此,如果您想在前一个“线程”完成之前再次触发相同的热键,您可以使用#MaxThreadsPerHotkey指令。

下面的代码交换Alt + TabCtrl + Tab功能——Ctrl + Tab将在应用程序Alt + Tab之间和浏览器中的选项卡之间切换。线程限制为 255,这意味着您可以按住Ctrl并(理论上)Tab在它停止工作之前按 255 次。

#UseHook
SendMode Input
#MaxThreads 255

#MaxThreadsPerHotkey 255
<!Tab::
Send {LCtrl down}{Tab}
Keywait LAlt
Send {LCtrl up}
return
#MaxThreadsPerHotkey

<^Tab::AltTab

我想我花了更多的时间试图让 AHK 热键做我想做的事情,而不是即使我活到一百岁,它们也可能拯救我。

于 2021-03-16T22:18:08.183 回答
-1

注意:我已经通过 Windows 注册表将 RControl 映射到我的 LWin 键上,因此 autohotkey 位于其之上。

我找到了很多简单的解决方案

>^Tab::
   Send {LAlt down}{Tab}
   KeyWait RControl
   Send {LAlt up}
   return

这里的问题是它不能处理 alt+tab+tab+tab 来返回 3 个程序。

我还意识到 AutoHotKeys 会阻止键盘信号,直到您通过释放所有键完成快捷方式,因此在我按住控制键时发送的任何其他选项卡都将被忽略。

我意识到我需要一个第二个 AutoHotKeys 进程来强制它通过。写起来似乎是一件相当多余的事情,但这是我的第二个脚本:

#IfWinActive "ahk_class TaskSwitcherWnd"
Tab::Send {Tab}
#IfWinActive

如果你不熟悉,这些#IfWinActive东西只是为了让它不会在每次发送 Tab 键时触发 - 只有当 Windows 的任务切换器处于焦点时。最终,这个脚本只是说Tab::Send {Tab}.

然后你需要告诉它也对 shift 键做出反应。奇怪的是,任务切换器可以很好地监听那个,但不是 Tab,所以我们也不需要在该脚本中转发 Shift 键。

最终,我的两个脚本如下所示:

脚本 1

#IfWinNotActive ahk_class TaskSwitcherWnd
; Remap Ctrl-Tab to Alt-Tab
$>^Tab::
    Send {Alt down}{Tab}
    Keywait Control
    Send {Alt up}
    return

; Remap Ctrl-Shift-Tab to Alt-Shift-Tab
$>^+Tab::
    Send {Alt down}{Shift down}{Tab}
    Keywait Control
    Send {Alt up}{Shift up}
    return
#IfWinActive

脚本 2

#IfWinActive ahk_class TaskSwitcherWnd
Tab::Send {Tab}
#IfWinActive

同时运行这些。

于 2020-06-08T05:33:24.803 回答
-1
<#Tab::AltTab

这会将“win + tab”重新映射到“alt tab”。它也适用于多次按下 Tab 键。

于 2021-06-15T14:25:53.543 回答