【问题标题】:AHK script to change RButton Behavior用于更改 RButton 行为的 AHK 脚本
【发布时间】:2020-11-01 19:11:51
【问题描述】:

我想制作一个脚本,让我每次按下鼠标都可以单击一次,但是,如果我不立即松开,而是按住 RMB 超过 0.25 秒,它会在释放时再次单击。

基本上让我可以正常使用人民币,只要我不持有太久,但允许我在持有的情况下双击。

这是一种解决方法,因为如果我点击太快,我的鼠标按钮就会卡住,并且我无法获得新的 atm。

这样做的目的是为了能够在 PS 上使用我的鼠标并玩我经常玩的一个游戏:Black Ops 2,同时我节省了足够的钱买一个新鼠标。在游戏的上下文中,我希望能够使用 Toggle ADS 作为基础,并且能够通过单击默认使用切换,但也能够使用相同的按钮即时保持 ADS 而无需更改游戏配置。

我对 AHK 不是很精通,到目前为止,我只掌握了这些,握持效果很好,但是如果我不握持,它会双击,这很烦人。

RButton Down::
Send {Click, Right}
       keywait RButton, t.25
     if errorlevel
       keywait RButton, 
    Send {RButton Up} 
return

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    您也许可以对多个 KeyWaits 进行一些欺骗,但由于 AHK 的单线程性质,我不建议在任何情况下在热键标签内进行耗时的处理。

    我建议使用非常简单的方法:

    ~*RButton::RClickTime := A_TickCount
    
    ~*RButton Up::
        if (A_TickCount - RClickTime >= 250)
            Click, Right
    return
    

    所以首先当我们按下 RButton 时(请注意,热键名称没有“按下”状态,键名本身意味着它被按下)我们将当前系统时间存储为 A_TickCount
    我们使用 ~ 修饰符作为热键,这样按键本身就不会被消耗。
    并且使用了* 修饰符,因此按住例如CtrlShift 等不会使热键不起作用。

    然后在 RButton 发布 (RButton Up::) 时,我们将当前系统时间与存储的系统时间进行比较,看看是否超过 250 毫秒。如果是这样,我们再发送一次右键单击Click, Right(不要在此处使用send command,它并不是真正用于此目的)。

    【讨论】:

    • 天哪,这就像一个魅力,非常感谢!我怎样才能使它与 IfWinActive 一起工作?我想让它只在游戏中有效,如果我 alt 选项卡,它会破坏任何动作。或者按键切换会很好,否则,非常感谢!
    • 另外,是否可以按 shift 打破计时器?因为当我按住时,如果我按下shift,它会在游戏中破坏ADS,但如果我之后松手,它会破坏冲刺瞄准,它只是让我死了哈哈
    • ShiftkeyPressed := false ~*RButton::RClickTime := A_TickCount While (GetKeyState("RButton", "P")) { if (GetKeyState("LShift", "D")) { ShiftKeyPressed := true break } } ~*RButton Up:: if(ShiftKeyPressed) { return } else { if (A_TickCount - RClickTime >= 250) Click, Right ShiftkeyPressed := false return } LShift:: Send LShift While (GetKeyState("LShift", "P")) { if (GetKeyState("RButton", "D")) { break } } 每次按 LShift 键时,它都不会破坏计时器和垃圾邮件类型“Lshift”
    • 呃,那个代码有很多问题,从无法访问的代码到语法和逻辑错误。但是对于 WinActive 检查,您将使用 #IfWinActive 指令,而对于关闭,您将使用 Suspend(例如 *F1::Suspend)并且不确定我是否理解您的目标。但是“轮班休息计时器”听起来你可以将存储的系统时间设置为例如换档时为零,因此 250 毫秒检查将永远不会通过 ~*Shift::RClickTime := 0
    • 我应该在哪里添加~*Shift::RClickTime := 0?最后添加它似乎不起作用,如果我按住然后按shift,我放手后它仍然会点击。至于瞄准的解释:如果我点击一次游戏将进入ADS(瞄准)模式,但如果我再次点击将退出。游戏有冲刺功能,所以如果我在 ADS 模式下,然后按冲刺 (LShift),它也会离开 ADS 模式。我还希望能够模拟 HOLD 到 ADS 模式(按下激活它并释放它会停用它),而不会失去 sprint 将我带出 ADS 的功能
    【解决方案2】:

    您的 if 块周围似乎缺少一些花括号;但我认为您可以通过以下简单的方式实现正确的双击功能,

    RButton::
      KeyWait RButton, T.25
      numberOfClicks := errorLevel + 1
      Send {Click Right %numberOfClicks%}
    return
    

    【讨论】:

    • 您好,感谢您的快速回复!虽然功能相同,但我最初遇到的问题仍然存在,当我开始尝试时,我想到了类似的事情,但延迟让我失望了。我需要控制第二次单击发生的时间,并且我需要在按下按钮后立即发生第一次(并且仅在某些情况下)单击,然后在我释放按钮时准确地进行第二次单击。实际上,我不需要实际的双击,因为我需要 2 次受控点击。我已将 OP 更新为更具体,它不仅适用于工作,也适用于游戏。
    【解决方案3】:
    ~RButton:: ;*When Right Mouse Button is Down, do the following.*
    keywait RButton, T.25 ;*Wait (250 milliseconds) for it to be released.*
    if errorlevel { ;*When it exceeds the said time*
    keywait RButton ;*Wait for it to be released*
    Send, {RButton Up} ;*Send Right Mouse Button up*
    }
    return
    

    【讨论】:

    • 欢迎来到 StackOverflow,虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 2019-05-17
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多