如何在 Autohotkey 中链接热键序列?

How to chain sequence of Hotkeys in Autohotkey?

我在这里和 ahk 的论坛上搜索了最后一个小时,但没有成功,尽管我确信这已经完成并且已经在某处询问过。也许我使用了错误的术语,但是问题来了:

我想创建一些快捷键序列,以便按下组合键 ^k (ctrl+k ) 进入我有 1 秒按下另一个键并为每个键获得不同结果的状态。 最好,它会通过按住 ctrl 然后 k 然后 {ab} 同时仍然持有 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 检查。它不会使它复杂化太多。