【问题标题】:Need to resend key if not processed?如果未处理,是否需要重新发送密钥?
【发布时间】:2021-03-16 18:31:18
【问题描述】:

我运行了我的第一个 AHK 脚本,拦截功能键并将它们转换为媒体键(仅在启用 ScrollLock 时)。效果很好。

但是,如果未启用 ScrollLock,那么我希望 AHK 将密钥传递给正在运行的应用程序。所以我添加了一个 else 子句来重新发送密钥(见下文),但是一旦我按下 F3,就会导致每秒 70 次以上的击键。好像我在一个循环中。

这段代码有什么问题?

F3::
  if GetKeyState("Scrolllock", "T") {
    Send {Volume_Up}
    SoundBeep 1000, 50
    SoundBeep 1100, 50
  } else {
    SendInput, {F3}
  }
return

【问题讨论】:

    标签: loops autohotkey


    【解决方案1】:
    $F3::
      if GetKeyState("Scrolllock", "T") {
        Send {Volume_Up}
        SoundBeep 1000, 50
        SoundBeep 1100, 50
      } else {
        SendInput, {F3}
      }
    return
    

    您遇到的问题是您的 Send 命令正在重新触发它所属的热键,这可以通过使用 $ 修饰符来防止。

    来自docs

    这通常只有在脚本使用发送命令 发送包含热键本身的键,否则可能会 使其自行触发。 $ 前缀强制键盘挂钩 用于实现此热键,它的副作用是防止 从触发它发送命令。 $ 前缀相当于拥有 在此热键定义上方的某处指定了#UseHook。

    【讨论】:

      【解决方案2】:

      假设您没有更复杂的脚本,caveats of #If 可能会弄乱它,我建议您使用以下方法来进行此类重映射。

      #If, GetKeyState("ScrollLock", "T")
      F3::
          SendInput, {Volume_Up}
          SoundBeep, 1000, 50
          SoundBeep, 1100, 50
      return
      #If
      

      这样,当滚动锁定未打开时,F3 将保持其原始功能。

      (发送 F3 与实际使用的键不同,某些程序可能无法识别模拟击键,尤其是使用直接输入时,您也会失去按住 F3 的功能)

      【讨论】:

        猜你喜欢
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多