【问题标题】:How do you remap alt+tab in autohotkey?如何在自动热键中重新映射 alt+tab?
【发布时间】:2020-09-27 00:54:25
【问题描述】:

如何让您的 alt+tab 功能像 OSX 一样使用 meta+tab 而不是 alt+tab,同时又尊重 shift 键?

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

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    有一个特殊的keyword 可以复制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 热键做我想做的事情,即使我活到一百岁,它们也无法拯救我。

    【讨论】:

    • 这似乎是一个非常好的解决方案。我将继续接受这一点,但我仍在使用我一年前制作的两个脚本,它们对我有用,所以我会离开我的。
    【解决方案2】:

    注意:我已通过 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
    

    同时运行这些。

    【讨论】:

    • 您的实现看起来很可疑,您是否看过文档中的this?此外,#IfWin[Not]Active 不使用表达式,因此您不会引用传递给它的字符串。如果即使犯了那个错误,这仍然对你有用,我真的不知道为什么/如何。
    • 感谢您的留言。我对这一切都很陌生,只是想让别人头疼,所以我真的希望我没有把这件事搞砸太糟糕。引用的字符串来自有关如何使用 IfWinActive 的示例。我以为我没有引用它。不管怎样,我已经更新了答案。我测试了它,它似乎工作。我确实看到了那个文档。问题在于,每一种可能性似乎都以自己独特的方式被窃听。例如,&gt;^TabM::AltTabMenu 在我释放控制时不会消失,因为 ctrl+alt+tab 具有该行为。相信我,我非常努力地按照推荐的方式做到这一点。
    • 是的,好东西,你设法得到了一个可行的解决方案。虽然我确信也有更漂亮的方法。如果我没有更好的事情可做,我可能会稍后尝试。
    【解决方案3】:
    <#Tab::AltTab
    

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

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2019-09-16
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 2011-03-13
      • 2014-02-25
      相关资源
      最近更新 更多