【问题标题】:AHK issue with mousewheel key remap鼠标滚轮键重新映射的 AHK 问题
【发布时间】:2015-05-01 09:18:16
【问题描述】:

我的脚本有问题,我不明白为什么它没有按我想要的方式工作。

我想要什么:当我向上使用鼠标滚轮时,我希望它使用我的健康瓶,或者向键盘发送一次“1键”,当我向下使用鼠标滚轮时,我希望它使用我的水银瓶(发送一次键盘'key 5'),但是发生了什么,它是重复的,所以它不是使用一次烧瓶,而是使用整个烧瓶,或者更确切地说它击中键盘键 1 或 5 几次,它的自动重复.

我的问题是:如何使用发送命令阻止它重复,因为在应用程序中,如果我按住 1 或 5 它不会自动重复,我必须再次单击它。所以发送命令是自动重复的,我不希望它这样做。

我想可能是因为当我向下或向上滚动鼠标滚轮时它会多次执行,但是当我在鼠标控制面板的窗口中将它设置为 1 时,它没有帮助。

这是我的脚本,我认为它很简单......

#IfWinActive Path of Exile

WheelUp::Send {1}

WheelDown::Send {5}

在我尝试使用发送命令之前,我尝试过使用这个脚本:

#IfWinActive Path of Exile

WheelUp::1

WheelDown::5

而且这个脚本在应用程序中根本不起作用......但如果我不使用#IfWinActive 行,它可以在应用程序之外工作。

任何帮助将不胜感激。

【问题讨论】:

  • afaik,你不需要 { }。 // 你确定你的鼠标没有多次触发热键吗?您可以通过在每次热键触发后递增全局计数器来检查它,并使用第三个热键或通过脚本主窗口(任务栏双击)检索其值。如果您确定,您可以尝试使用sendEventsendRaw,而不是默认为sendPlay 的普通Send,除非另有说明。我不知道任何其他解决方案
  • 我认为是我的鼠标过于敏感,因为如果我真的很努力不要过度滑动滚轮,它只会使用一次。
  • @Blauhirn 没关系,我自己想出来的,不确定这是否是最好的方法,但这是有效的方法:#IfWinActive Path of Exile WheelUp:: Send, {1 down} Sleep 5000 发送,{1 向上} 返回 WheelDown:: 发送,{5 向下} 睡眠 5000 发送,{5 向上} 返回
  • 很高兴它成功了。您应该将其发布为答案并接受您的答案。如果其他人有类似的问题,我也会发布另一个想法

标签: autohotkey


【解决方案1】:

假设是您的鼠标多次触发热键,您可以尝试以下方法(未测试):

hotkey, ifWinActive, Path of Exile
hotkey, WheelUp, send1, on
hotkey, WheelDown, send5, on
hotkey, ifWinActive
return

send1:
send 1
hotkey, WheelUp, send1, off ; prevents WheelUp to send 1 more than one time for 1000 ms
sleep, 1000
hotkey, ifWinActive, Path of Exile
hotkey, WheelUp, send1, on
hotkey, ifWinActive
return

send5:
send 5
hotkey, WheelDown, send5, off ; prevents WheelDown to send 5 more than one time for 1000 ms
sleep, 1000
hotkey, ifWinActive, Path of Exile
hotkey, WheelDown, send5, on
hotkey, ifWinActive
return

【讨论】:

    【解决方案2】:

    您的第一个脚本(如下)针对鼠标滚轮的每个槽口发送一个按键按下事件,紧接着是一个按键按下事件。除非鼠标滚轮仍在移动(如鼠标所报告的那样),否则不会重复击键。发送命令自动重复。

    #IfWinActive Path of Exile
    WheelUp::Send {1}
    WheelDown::Send {5}
    

    游戏无法像其他应用程序那样可靠地响应 Send 是很常见的,因此常见问题解答Why do Hotstrings, Send, and Click have no effect in certain games? 提供了一些可能的解决方案。例如,我建议使用SetKeyDelayPressDuration 参数来增加“按下”和“释放”键之间的延迟。或者,您可以使用Send {1 down}Sleep xxxSend {1 up}

    您可能需要在每个发送的前面添加{Blind},例如Send {Blind}1,否则可能会干扰您使用修饰键。例如,如果您按住 Ctrl,Send 1 将自动“释放”Ctrl,发送 1,然后“按下”Ctrl 回退。

    如果您的鼠标导致热键多次触发,Blauhirn 的回答可能有效,但可以简化(如上所述添加):

    SetKeyDelay 20, 20
    
    #IfWinActive Path of Exile
    
    WheelUp::
        Send {Blind}{1}
        Sleep 500  ; Wait 500ms
        return  ; WheelUp can't fire a second instance until the first returns.
    
    WheelDown::
        Send {Blind}{5}
        Sleep 500
        return
    

    这种简单方法的缺点是,如果您在第一个 Sleep 返回之前(即在本例中为 500 毫秒内)激活一个热键,然后激活另一个热键,则两者都将被阻止,直到第二个 Sleep 完成。减少睡眠时间将有助于避免这种情况。

    你的第二个脚本无效。WheelUp::1无效,如documented

    内置重映射方法不支持以下键:

    • 鼠标滚轮(WheelUp/Down/Left/Right)。

    原因是与其他键不同,WheelUp/Down“伪键”只能按下,不能释放。因此,当您重新映射 WheelUp::1 时,它会将 WheelUp 映射到 {1 down} 并且从不发送 {1 up};也就是说,它按下 1 但从不释放它。

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多