使用自动热键捕获右键单击+左键单击;意外行为



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

1)这有效:

RButton & LButton::
    Send X
Return

按预期工作:

  • 如果我按鼠标右键,然后按鼠标左键,"X"被发送到活动窗口
  • 右键单击事件由 Authotkey 捕获:当我单独按下鼠标右键时,没有显示上下文菜单。这是预期的结果

2)这有效

~RButton & LButton::
    Send Y
Return

按预期工作:

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

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

这不起作用(注意:这将在每个应用程序中禁用 righ-click)

#If WinActive("ahk_class MozillaWindowClass")
RButton & LButton::
    Send X
Return

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

无法按预期工作:

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

我在这里做错了什么?


编辑:

目标是这样的:我想要一个全局热键在右+左键单击RButton & LButton.在我测试兼容性的特定应用程序中,我希望右键单击+左键单击以禁止发送右键单击,然后使用 autohotkey 手动发送右键单击。但是,由于某些应用程序在处理 autohotkey 发送的鼠标事件时可能会遇到问题,因此在所有未经测试的应用程序中,我想将 ~RButton & LButton 与 ~ 一起使用以传递右键单击事件

这是一个支持右键单击拖动的!

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的问题。

<小时 />

老东西

请参阅有关与号的文档(强调我的):

您可以通过在两个键之间使用 " & 来定义两个键(操纵杆按钮除外)的自定义组合。在下面的示例中,您将按住 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. 发送RButton
  3. Firefox 未激活,因此处理了第二个变体
  4. <延迟>(RButton被按住,尽管延迟可能难以察觉,从毫秒到无限)
  5. 火狐浏览器变得活跃
  6. <延迟>(仍按住)
  7. 发送RButton,根据文档发送RButton。因为 Firefox 在活动窗口检查和发送RButton之间的延迟中处于活动状态,所以RButton被发送到 Firefox。

当 Firefox 和另一个窗口都可见,并且另一个窗口在单击时处于活动状态时,就会发生这种情况。

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

最新更新