AutoHotKey - 三指拖动脚本导致小问题,如何解决?
AutoHotKey - Three finger dragging script causing minor issue, how to fix?
背景
我有以下 AHK 脚本(从 https://medium.com/@dakshin.k1/enable-3-finger-gesture-for-click-and-drag-on-windows-and-linux-cd7165b66851 获得):
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance force
; Enable three-finger drag
drag_enabled := 0
+^#F22::
if (drag_enabled) {
Click up
drag_enabled := 0
} else {
drag_enabled := 1
Click down
}
return
LButton::
if (drag_enabled) {
Click up
drag_enabled := 0
} else {
click
}
return
这应该可以在 any Windows 10 笔记本电脑的触摸板上启用 Mac 式三指拖动,但需要执行以下三个步骤:
- 执行三指点击。
- 将鼠标指针移动到您想要的任何位置。如果拖动 window,window 应该(并且确实)在您移动光标时跟随它。如果选择文本,您应该会看到文本像您期望的那样突出显示,甚至双指滚动也应该有效(并且确实有效)!
- 执行单指点击以完成模拟手势。
问题
我对 AHK 能够做到这一切感到非常惊讶,所以它 相当 没有我想的那么好也就不足为奇了希望。经过一段不确定的时间后,我无法再click/tap 正常使用触摸板。
我的问题
+^#F22
实际上是做什么的?文档和我对 AHK 的有限了解似乎暗示它将 Shift+Ctrl+Win+Whatever F22 means
设置为启用上述步骤 1. 的热键。但它是否也启用第 2 步?如果不是...
- AHK 如何能够跟踪鼠标指针,在可以将任意数量的手指移出并重新接触触摸板的同时保持拖动操作继续进行? 脚本的哪几行调用了哪些 Win32 API 函数?
- 如何解决触摸板点击问题(我感觉答案是“你不能”,但请证明我错了)?
我已经在这上面花了大约 2 个小时,阅读文档并尝试重新熟悉 AHK,因为自从我上次使用它已经有一段时间了(即便如此,我什么也没做 一半这么高级)!
+^#F22
照你说的做,它为 Shift+Ctrl+Win 注册了一个热键+F22(是的,F 键 13-24 存在)。
因此,在您的安装中,执行三指点击应该将该组合键发送到 Windows。
您可以尝试使用 SendInput, +^#{F22}
那应该打开 Windows search/Cortana.
在我的笔记本电脑上,三指轻敲只是发送了一个简单的 Win+s 到 Windows。
但我猜你的安装是不同的(不管什么原因)。
您可以通过使用例如找到确切发送的内容Keyhistory
(docs).
那么无论如何,脚本是如何工作的? AHK新手做的其实真的非常简单明了。
当三指点击被拦截时(通过 +^#F22
热键),脚本会检查用户定义的切换 drag_enabled
的计算结果是真还是假。
- 如果为false,则没有进行拖动。因此它通过发送 LButton 按下事件开始拖动。
- 如果为真,则正在进行拖动。所以它通过发送一个 LButton up 事件来结束拖动。
有 LButton
热键,因此也可以通过单击 L 按钮结束拖动。
热键实际上实现得很糟糕,它破坏了 LButton 的本机功能。我会在下面解决这个问题。
AHK 如何能够跟踪鼠标指针,保持拖动动作的进行,同时可以将任意数量的手指从触摸板上移开并重新接触触摸板?
AHK 不关心这些。这一切都由 Windows 处理。进行哪些鼠标移动(单击除外)对拖动操作无关紧要。只有点击才会取消 LButton 的按住。
如何解决触摸板点击问题(我感觉答案是“你不能”,但请证明我错了)?
我不太明白你的意思,但我可以 guess/hope 这只是由于实施不当的 LButton
热键造成的。我想试试看我下面的改进版本是否修复了它。
所以改进版:
+^#F22::
if (drag_enabled)
Click, Up
else
Click, Down
drag_enabled := !drag_enabled
return
#If, drag_enabled
LButton::
Click, Up
drag_enabled := false
return
#If
更改基本上只是 compacting/removing 无用代码和正确实现 LButton
热键,以便在不进行拖动时不破坏 LButton 的本机功能。
似乎在我的笔记本电脑上工作得很好,除了我用 #s
.
替换 +^#F22
背景
我有以下 AHK 脚本(从 https://medium.com/@dakshin.k1/enable-3-finger-gesture-for-click-and-drag-on-windows-and-linux-cd7165b66851 获得):
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance force
; Enable three-finger drag
drag_enabled := 0
+^#F22::
if (drag_enabled) {
Click up
drag_enabled := 0
} else {
drag_enabled := 1
Click down
}
return
LButton::
if (drag_enabled) {
Click up
drag_enabled := 0
} else {
click
}
return
这应该可以在 any Windows 10 笔记本电脑的触摸板上启用 Mac 式三指拖动,但需要执行以下三个步骤:
- 执行三指点击。
- 将鼠标指针移动到您想要的任何位置。如果拖动 window,window 应该(并且确实)在您移动光标时跟随它。如果选择文本,您应该会看到文本像您期望的那样突出显示,甚至双指滚动也应该有效(并且确实有效)!
- 执行单指点击以完成模拟手势。
问题
我对 AHK 能够做到这一切感到非常惊讶,所以它 相当 没有我想的那么好也就不足为奇了希望。经过一段不确定的时间后,我无法再click/tap 正常使用触摸板。
我的问题
+^#F22
实际上是做什么的?文档和我对 AHK 的有限了解似乎暗示它将Shift+Ctrl+Win+Whatever F22 means
设置为启用上述步骤 1. 的热键。但它是否也启用第 2 步?如果不是...- AHK 如何能够跟踪鼠标指针,在可以将任意数量的手指移出并重新接触触摸板的同时保持拖动操作继续进行? 脚本的哪几行调用了哪些 Win32 API 函数?
- 如何解决触摸板点击问题(我感觉答案是“你不能”,但请证明我错了)?
我已经在这上面花了大约 2 个小时,阅读文档并尝试重新熟悉 AHK,因为自从我上次使用它已经有一段时间了(即便如此,我什么也没做 一半这么高级)!
+^#F22
照你说的做,它为 Shift+Ctrl+Win 注册了一个热键+F22(是的,F 键 13-24 存在)。
因此,在您的安装中,执行三指点击应该将该组合键发送到 Windows。
您可以尝试使用 SendInput, +^#{F22}
那应该打开 Windows search/Cortana.
在我的笔记本电脑上,三指轻敲只是发送了一个简单的 Win+s 到 Windows。
但我猜你的安装是不同的(不管什么原因)。
您可以通过使用例如找到确切发送的内容Keyhistory
(docs).
那么无论如何,脚本是如何工作的? AHK新手做的其实真的非常简单明了。
当三指点击被拦截时(通过 +^#F22
热键),脚本会检查用户定义的切换 drag_enabled
的计算结果是真还是假。
- 如果为false,则没有进行拖动。因此它通过发送 LButton 按下事件开始拖动。
- 如果为真,则正在进行拖动。所以它通过发送一个 LButton up 事件来结束拖动。
有 LButton
热键,因此也可以通过单击 L 按钮结束拖动。
热键实际上实现得很糟糕,它破坏了 LButton 的本机功能。我会在下面解决这个问题。
AHK 如何能够跟踪鼠标指针,保持拖动动作的进行,同时可以将任意数量的手指从触摸板上移开并重新接触触摸板?
AHK 不关心这些。这一切都由 Windows 处理。进行哪些鼠标移动(单击除外)对拖动操作无关紧要。只有点击才会取消 LButton 的按住。
如何解决触摸板点击问题(我感觉答案是“你不能”,但请证明我错了)?
我不太明白你的意思,但我可以 guess/hope 这只是由于实施不当的 LButton
热键造成的。我想试试看我下面的改进版本是否修复了它。
所以改进版:
+^#F22::
if (drag_enabled)
Click, Up
else
Click, Down
drag_enabled := !drag_enabled
return
#If, drag_enabled
LButton::
Click, Up
drag_enabled := false
return
#If
更改基本上只是 compacting/removing 无用代码和正确实现 LButton
热键,以便在不进行拖动时不破坏 LButton 的本机功能。
似乎在我的笔记本电脑上工作得很好,除了我用 #s
.
+^#F22