微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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",如果按下了其中一个,则返回消息框。如果这两个键都没有按下,则循环 10 次后,将打开第三个消息框。

严格来说,您不必同时按下所有 3 个键即可获得您想要的效果。按 ctrl+k 并开始循环后,您只需按 a 或 b 即可弹出消息框,但由于时间太快,我认为它应该像您想象的那样工作。如果您真的希望按下所有 3 个键,还需要为 k 和 ctrl 添加 get 键状态,但我认为这是不必要的。

^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 秒窗口。我真的不明白。它的目的是什么?对我来说听起来很无用,因为无论如何都需要按住 k。如果 k 可以在中途发布,那就有意义了。

如果 1 秒窗口在某种程度上有用/需要,则必须在那里添加 A_TickCount 检查。它不会让它变得更复杂。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。