如何在 Autohotkey 中链接热键序列?
How to chain sequence of Hotkeys in Autohotkey?
我在这里和 ahk 的论坛上搜索了最后一个小时,但没有成功,尽管我确信这已经完成并且已经在某处询问过。也许我使用了错误的术语,但是问题来了:
我想创建一些快捷键序列,以便按下组合键 ^k
(ctrl+k ) 进入我有 1 秒按下另一个键并为每个键获得不同结果的状态。
最好,它会通过按住 ctrl 然后 k 然后 {a 或 b} 同时仍然持有 k。如果我按下 ctrl+k 并释放,它会发送 ctrl+k 像往常一样转到焦点应用程序。
^k then a::does something (with ctrl pressed down)
^k then b::does something else (with ctrl pressed down)
^k alone::sends ^k as usual
对于那些使用 sublime 的人,我所追求的行为与 ctrl + k 然后 b 相同 切换侧边栏。 (我相信其他编辑也有类似的行为)
感谢您的关注和时间。
所以下面的代码是在您按下 ctrl+k 后循环 10 次并检查是否按下了“a”或“b”,如果按下了其中任何一个则 returns 消息框。 10 次循环后,如果这 2 个键都没有被按下,则打开第 3 个消息框。
严格来说,您不必同时按下所有 3 个键来获得您想要的效果。在您按下 ctrl+k 并开始循环后,您只需按下 a 或 b 即可弹出消息框,但由于时间如此之快,我认为它应该可以像您想象的那样工作。如果你真的想要按下所有 3 个键,请为 k 和 ctrl 添加获取键状态,但在我看来这是不必要的。
^k::
loop,10
{
AIsDown := GetKeyState("a",P)
BIsDown := GetKeyState("b",P)
KIsDown := GetKeyState("k",P)
CtrlIsDown := GetKeyState("ctrl",P)
if(AIsDown == "1")
{
msgbox % "A was pressed"
break
}
if(BIsDown == "1")
{
msgbox % "B was pressed"
break
}
if(A_Index == 10) or (KIsDown == "0") or (CtrlIsDown == "0")
{
msgbox % "Proceed with ctrl + k only"
break
}
sleep,100
}
我现在不得不直言不讳,接受的答案中的代码会让我做噩梦。真是惨不忍睹
实际应该这样做:
^k::return
#If, A_PriorHotkey = "^k"
^a::ToolTip, % A_ThisHotkey " pressed with ^k"
^b::ToolTip, % A_ThisHotkey " pressed with ^k"
^c::ToolTip, % A_ThisHotkey " pressed with ^k"
^d::ToolTip, % A_ThisHotkey " pressed with ^k"
^k up::SendInput, ^k
#If
通过创建上下文相关的热键并只检查以前的热键是什么,非常方便。
应该很简单明了,但无论如何这里有一个解释:
首先为 Ctrl + K 创建一个空的热键来消耗对它的任何按下并设置 A_PriorHotkey
.
然后创建上下文相关的热键,如果 Ctrl + K 仍然按住,它将成为以前的热键。否则它的发布 ^k up
将是以前的热键。
除您描述的那 1 秒 window 外,这将按要求工作。我真的不明白。它的目的是什么?对我来说听起来毫无用处,因为 k
无论如何都需要按住。如果 k
可以中途发布,那将是有意义的。
如果 1 秒 window 不知何故 useful/needed,则必须在其中添加一个 A_TickCount
检查。它不会使它复杂化太多。
我在这里和 ahk 的论坛上搜索了最后一个小时,但没有成功,尽管我确信这已经完成并且已经在某处询问过。也许我使用了错误的术语,但是问题来了:
我想创建一些快捷键序列,以便按下组合键 ^k
(ctrl+k ) 进入我有 1 秒按下另一个键并为每个键获得不同结果的状态。
最好,它会通过按住 ctrl 然后 k 然后 {a 或 b} 同时仍然持有 k。如果我按下 ctrl+k 并释放,它会发送 ctrl+k 像往常一样转到焦点应用程序。
^k then a::does something (with ctrl pressed down)
^k then b::does something else (with ctrl pressed down)
^k alone::sends ^k as usual
对于那些使用 sublime 的人,我所追求的行为与 ctrl + k 然后 b 相同 切换侧边栏。 (我相信其他编辑也有类似的行为)
感谢您的关注和时间。
所以下面的代码是在您按下 ctrl+k 后循环 10 次并检查是否按下了“a”或“b”,如果按下了其中任何一个则 returns 消息框。 10 次循环后,如果这 2 个键都没有被按下,则打开第 3 个消息框。
严格来说,您不必同时按下所有 3 个键来获得您想要的效果。在您按下 ctrl+k 并开始循环后,您只需按下 a 或 b 即可弹出消息框,但由于时间如此之快,我认为它应该可以像您想象的那样工作。如果你真的想要按下所有 3 个键,请为 k 和 ctrl 添加获取键状态,但在我看来这是不必要的。
^k::
loop,10
{
AIsDown := GetKeyState("a",P)
BIsDown := GetKeyState("b",P)
KIsDown := GetKeyState("k",P)
CtrlIsDown := GetKeyState("ctrl",P)
if(AIsDown == "1")
{
msgbox % "A was pressed"
break
}
if(BIsDown == "1")
{
msgbox % "B was pressed"
break
}
if(A_Index == 10) or (KIsDown == "0") or (CtrlIsDown == "0")
{
msgbox % "Proceed with ctrl + k only"
break
}
sleep,100
}
我现在不得不直言不讳,接受的答案中的代码会让我做噩梦。真是惨不忍睹
实际应该这样做:
^k::return
#If, A_PriorHotkey = "^k"
^a::ToolTip, % A_ThisHotkey " pressed with ^k"
^b::ToolTip, % A_ThisHotkey " pressed with ^k"
^c::ToolTip, % A_ThisHotkey " pressed with ^k"
^d::ToolTip, % A_ThisHotkey " pressed with ^k"
^k up::SendInput, ^k
#If
通过创建上下文相关的热键并只检查以前的热键是什么,非常方便。
应该很简单明了,但无论如何这里有一个解释:
首先为 Ctrl + K 创建一个空的热键来消耗对它的任何按下并设置 A_PriorHotkey
.
然后创建上下文相关的热键,如果 Ctrl + K 仍然按住,它将成为以前的热键。否则它的发布 ^k up
将是以前的热键。
除您描述的那 1 秒 window 外,这将按要求工作。我真的不明白。它的目的是什么?对我来说听起来毫无用处,因为 k
无论如何都需要按住。如果 k
可以中途发布,那将是有意义的。
如果 1 秒 window 不知何故 useful/needed,则必须在其中添加一个 A_TickCount
检查。它不会使它复杂化太多。