使用 AutoHotkey 将一组特定的按键映射到其他按键?

使用 AutoHotkey 将一组特定的按键映射到其他按键?

我正在尝试将触摸板上的三指滑动手势映射到 Ctrl+Win+Left 或 Ctrl+Win+Right(在虚拟桌面之间切换)。以下是我向左滑动时按下的键:

VK  SC  Type    Up/Dn   Elapsed Key     Window
-------------------------------------------------------
A2  01D a   d   1.08    LControl        
A4  038 a   d   0.00    LAlt            
09  00F a   d   0.00    Tab             
09  00F a   u   0.00    Tab             
A4  038 a   u   0.00    LAlt            
A2  01D a   u   0.00    LControl        
0D  01C a   d   0.20    Enter           Task Switching
0D  01C a   u   0.00    Enter   

当我向右滑动时:

VK  SC  Type    Up/Dn   Elapsed Key     Window
-----------------------------------------------
A2  01D a   d   1.69    LControl        
A4  038 a   d   0.00    LAlt            
A0  02A a   d   0.00    LShift          
09  00F a   d   0.00    Tab             
09  00F a   u   0.00    Tab             
A0  02A a   u   0.01    LShift          
A4  038 a   u   0.00    LAlt            
A2  01D a   u   0.00    LControl        
0D  01C a   d   0.16    Enter           Task Switching
0D  01C a   u   0.00    Enter  

我如何将它们映射到 Ctrl+Win+Left 和 Ctrl+Win+Right?

我尝试过这个Alt & Ctrl & Enter & Tab::Send test,但它说这是一个无效的程序。

如果相关的话,我在装有 Synaptics 触摸板驱动程序的 Thinkpad L440 上使用 Windows 10。

答案1

经过一两个小时的捣鼓,我终于明白了:

swipeDirection := ""

^!Tab::
    swipeDirection := "L"
return

^!+Tab::
    swipeDirection := "R"
return

$Enter::
    if (not swipeDirection) {
        SendInput {Enter}
    } else if (swipeDirection = "L") {
        SendInput ^#{Left}
    } else if (swipeDirection = "R") {
        SendInput ^#{Right}
    }
    swipeDirection := ""
return

如果有更好的方法请告诉我!

编辑:

我在我的博客上写到了这一点:https://www.wptutor.io/misc/windows-virtual-desktop-swipe-gestures

答案2

选择是Enter基于对话框的吗?如果是,则不会将其作为自动化的一部分发送。

我相信以下代码应该生成列出的键盘记录,但未经测试......

^#Left::
    SendInput ^!{Tab}
    SendInput {Enter}    ; use only if needed
Return

^#Right::
    SendInput ^!+{Tab}
    SendInput {Enter}
 Return

在帮助文件中查找键列表和修饰符列表

^ = Control
! = Alt
# = Win
+ = Shift

此外,如果这是 Windows 10 的新功能,那么这些键可能无法完全按照预期工作,您可能需要使用AltTabShiftAltTabControl 键修饰符。在以前版本的 Windows 上,这些组合可能具有特殊行为,因此存在特殊情况(请参阅AltTab帮助文件)。

您还可以手动尝试按键,看看它是否能像滑动一样工作。如果手动尝试有效,那么 AutoHotkey 按键应该可以工作,而无需使用特殊功能。例如,尝试按 Ctrl+Alt+Tab(向下,向上)然后按 Enter(向下,向上),或按 Shift+Ctrl+Alt+Tab(向下,向上)然后按 Enter(向下,向上)。这就是按键日志用du字符指示的内容。

编辑...

根据后续的跟进帖子,我明白了为什么上面的代码在功能上是倒退的(我最初并不完全理解这个问题,但我会保留我上面的原始帖子)。

在回答“更好的方法”的问题时,发布的代码已经看起来很棒并且非常简单(没有理由真正改变它) - 下面两种可能的风格差异只是为了展示问题答案的一些可能的变化 - 使用内置热键变量和三元运算符的代码可能会“更干净”。

首先,热键变量A_ThisHotkeyA_PriorHotkey用于检测当前热键和最后触发的热键。这样,您就可以通过摆脱用于跟踪最后触发的变量来简化变量分配。热键定义仍然需要到位,以便捕获和丢弃事件,但现在除了返回之外,它们不需要做任何事情。

^!Tab::return
^!+Tab::return
$Enter::
    if (A_PriorHotkey="^!Tab") {
        SendInput ^#{Left}
    } else if (A_PriorHotkey="^!+Tab") {
        SendInput ^#{Right}
    } else
        SendInput {Enter}
return

您可以看到它已经看上去更简单并且分布更少了。

最后一种变化是使用三元运算符来有效地执行 If-Then-Else 语句并将所有内容组合成一个语句:

^!Tab::Return
^!+Tab::Return
$Enter::SendInput % (A_PriorHotkey="^!Tab") ? "^#{Left}" : (A_PriorHotkey="^!+Tab") ? "^#{Right}" : "{Enter}"       ; Final 'Else' Statement

减少到三行代码,但不是最易读的。

利用 AutoHotkey 的最后一项功能,当行以逗号、冒号或句号开头时,可以使用自动连续运算符将单行拆分为几行...这允许使用逻辑换行符,并且使用三元运算符形成非常清晰的 If-Then-Else 结构?,而无需一堆 If-Then-Else-Else-Else 语句。

最终的代码看起来像这样...

^!Tab::return
^!+Tab::return
$Enter::SendInput % (A_PriorHotkey="^!Tab")  ? "^#{Left}"
                  : (A_PriorHotkey="^!+Tab") ? "^#{Right}"
                  : "{Enter}"    ; Final 'Else' Statement

或者在最后的“Else”上使用替代间距,以保持所有发送参数垂直对齐......

^!Tab::return
^!+Tab::return
$Enter::SendInput % (A_PriorHotkey="^!Tab")  ? "^#{Left}"
                  : (A_PriorHotkey="^!+Tab") ? "^#{Right}"
                                             : "{Enter}"      ; Final 'Else' Statement

最后要说明的是——我实际上无法测试上面的代码摘录,尽管我相信它们应该可以正常工作。它们都只是样式更新(即对发布原始问题的用户已经发布的后续代码的更新)——最终没有功能差异,只有 AutoHotkey 提供的一些功能(如果您继续开发)。

相关内容