【问题标题】:capturing right-click+left-click with autohotkey; unexpected behaviour使用自动热键捕获右键单击+左键单击;意外行为
【发布时间】:2012-05-06 06:00:05
【问题描述】:

我想捕获键事件“按下鼠标右键,然后按下鼠标左键”。自动热键没有问题。但是,我仍然无法让鼠标右键单独工作。

1) 这行得通:

RButton & LButton::
    Send X
Return

按预期工作:

  • 如果我按鼠标右键,然后按鼠标左键,“X”将发送到活动窗口
  • Authotkey 捕获右键单击事件:no 当我单独按下鼠标右键时出现上下文菜单。这是预期的结果

2) 这行得通

~RButton & LButton::
    Send Y
Return

按预期工作:

  • 如果我按鼠标右键,然后按鼠标左键,“Y”将发送到活动窗口
  • Authotkey 未捕获右键单击事件:当我单独按下鼠标右键或同时按下鼠标左键时,上下文菜单确实出现。这是预期的结果

3) 现在我想根据活动窗口做不同的事情。

这不起作用(小心:这将禁用每个应用程序中的右键单击)

#If WinActive("ahk_class MozillaWindowClass")

RButton & LButton::
    Send X
Return


#If !WinActive("ahk_class MozillaWindowClass")
~RButton & LButton::
    Send Y
Return

没有按预期工作:

  • 在 Firefox 中左右发送 X,在其他应用程序中左右发送 Y
  • 但是,每个应用程序都禁用了右键单击

我在这里做错了什么?


编辑:

目标是这样的:我想要一个全局热键,右击+左击RButton & LButton。在我测试过兼容性的特定应用程序中,我希望右键单击以抑制发送右键单击,然后使用自动热键手动发送右键单击。但是,由于某些应用程序可能无法处理 autohotkey 发送的鼠标事件,因此在所有未经测试的应用程序中,我想使用 ~RButton & LButton 和 ~ 来传递右键单击事件

【问题讨论】:

    标签: windows mouse autohotkey


    【解决方案1】:

    这里是支持右键拖动的!

    Hotkey, LButton, off
    
    #IfWinActive ahk_class MozillaWindowClass
    RButton & LButton::
        Send X
    Return
    
    RButton::return
    
    #IfWinNotActive ahk_class MozillaWindowClass
    ~$RButton::
    Hotkey, LButton, on
    while GetKeyState("RButton", "P") {
        continue
        }
    Hotkey, LButton, off
    Return
    
    LButton::Send Y
    Return
    

    它手动处理RButton。当按下RButton 时,它会启用LButton 热键并等待RButton 被释放,然后再将其停用。 RButton 热键使用~,正常通过点击。

    LButton 在开头被顶部的行禁用。

    另一种方法是在热键的开头发送{RButton Down},在结尾发送{RButton Up}

    响应您的编辑,唯一拒绝 Autohotkey 发送事件的程序应该是那些依赖低级挂钩的程序......底部方法的真正问题是它只发送一次单击,而不是处理保持按钮。这种方法,以及分别向下和向上发送,都应该正确地做到这一点。

    此答案底部描述的带有活动窗口的错误仍然存​​在,但这是#IfWin[Not]Active 的问题。


    旧东西

    documentation on the ampersand(强调我的):

    您可以通过在它们之间使用“&”来定义两个键(操纵杆按钮除外)的自定义组合。在下面的示例中,您将按住 Numpad0 然后按第二个键来触发热键:

    Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
    Numpad0 & Numpad2::Run Notepad
    

    在上面的例子中,Numpad0 成为前缀键;但这也会导致 Numpad0 在被自己按下时失去其原始/原生功能。 为避免这种情况,脚本可以将 Numpad0 配置为执行新的操作,例如以下之一:

    Numpad0::WinMaximize A   ; Maximize the active/foreground window.
    Numpad0::Send {Numpad0}  ; Make the release of Numpad0 produce a Numpad0 keystroke. See comment below.
    

    上述热键之一的存在会导致释放 Numpad0 以执行指示的操作,但前提是您在按住 Numpad0 时没有按任何其他键。

    所以,按照那个例子:

    #If WinActive("ahk_class MozillaWindowClass")
    
    RButton & LButton::
        Send X
    Return
    
    RButton::return
    
    #If !WinActive("ahk_class MozillaWindowClass")
    RButton & LButton::
        Send Y
    Return
    
    RButton::Send {RButton}
    

    注意RButton 需要一个在WinActive 中什么都不做的变体,至少在我的测试中(见下文):RButton::return


    由于我使用的是 Autohotkey 标准,而不是 Autohotkey_L,因此我没有 #If,以上内容未经测试。以下我做了测试,它可以工作。

    #IfWinActive ahk_class MozillaWindowClass
    RButton & LButton::
        Send X
    Return
    
    RButton::return
    
    
    #IfWinNotActive ahk_class MozillaWindowClass
    RButton & LButton::
        Send Y
    Return
    
    RButton::Send {RButton}
    

    我注意到一个有趣的错误是第二个(NotActive)变体偶尔适用于 Firefox:

    1. 另一个窗口处于活动状态
    2. RButtondown已发送
    3. Firefox 未激活,因此处理第二个变体
    4. RButton 被按住,尽管延迟可能难以察觉,以毫秒为单位,直至无限)
    5. Firefox 激活
    6. (仍然按住)
    7. RButton up 已发送,根据文档发送 RButton。因为 Firefox 在活动窗口检查和发送 RButton 之间的延迟时变为活动状态,所以 RButton 被发送到 Firefox。

    当 Firefox 和另一个窗口都可见时,会发生这种情况,而另一个窗口在单击时是活动窗口。

    我尝试通过在 RButton 热键中添加额外的 IfWinNotActive 检查来修复此错误,但它似乎不起作用。

    【讨论】:

    • 谢谢,我没想过要尝试RButton::Send {RButton}!但是,我有点担心这可能会导致稍后在某些使用右键拖动或使用与 AHK 的发送命令不兼容的方法来处理鼠标事件的应用程序中出现问题。 ~RButton 和 LButton 的好处(在问题的第二个工作变体中)是它根本不修改右键单击事件,因此这些应用程序将能够不受干扰地处理右键单击,并且只有 right+左键修改。
    • 问题是,在这种情况下,keydown 上的热键激活的默认值已更改为 keyup。我看不到任何改变这一点的选择。也有可能(我猜)只有RButton,没有`& LButton, and use a while`循环来检查RButton的状态。如果您对此建议感到满意,以及您能想到的任何问题,请告诉我,我会写下来。
    • 好吧,我并不热衷于运行一个全局修改右键单击的脚本。这似乎是我会在 3 个月内忘记并想知道为什么特定应用程序对右键单击没有反应的事情。我想我可以使用应用程序的白名单,因为我可能不需要在每个应用程序中使用我的右键+左键单击脚本。我不确定while循环是否会更好,您仍然必须全局捕获右键单击以避免将其发送到特定应用程序,对吧?
    • 我刚刚在答案顶部添加的那个似乎可以解决我扔给它的所有问题。它仍然需要在 Firefox 上设置 RButton 变体来阻止它,并在所有其他程序上通过 (~)。
    • 谢谢,目前看起来很不错,会测试它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2015-03-03
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2013-06-28
    相关资源
    最近更新 更多