我正在尝试将触摸板上的三指滑动手势映射到 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 的新功能,那么这些键可能无法完全按照预期工作,您可能需要使用AltTab
和ShiftAltTab
Control 键修饰符。在以前版本的 Windows 上,这些组合可能具有特殊行为,因此存在特殊情况(请参阅AltTab
帮助文件)。
您还可以手动尝试按键,看看它是否能像滑动一样工作。如果手动尝试有效,那么 AutoHotkey 按键应该可以工作,而无需使用特殊功能。例如,尝试按 Ctrl+Alt+Tab(向下,向上)然后按 Enter(向下,向上),或按 Shift+Ctrl+Alt+Tab(向下,向上)然后按 Enter(向下,向上)。这就是按键日志用d
和u
字符指示的内容。
编辑...
根据后续的跟进帖子,我明白了为什么上面的代码在功能上是倒退的(我最初并不完全理解这个问题,但我会保留我上面的原始帖子)。
在回答“更好的方法”的问题时,发布的代码已经看起来很棒并且非常简单(没有理由真正改变它) - 下面两种可能的风格差异只是为了展示问题答案的一些可能的变化 - 使用内置热键变量和三元运算符的代码可能会“更干净”。
首先,热键变量A_ThisHotkey
可A_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 提供的一些功能(如果您继续开发)。