3

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

1)这有效:

RButton & LButton::
    Send X
Return

按预期工作:

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

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
  • 但是,在每个应用程序中都禁用了右键单击

我在这里做错了什么?


编辑:

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

4

1 回答 1

3

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

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. <delay> (RButton被按住,尽管延迟可能是难以察觉的,以毫秒为单位,到无限)
  5. Firefox 激活
  6. <延迟>(仍然按住)
  7. RButton up被发送,它RButton根据文档发送。因为 Firefox 在活动窗口检查和发送时之间的延迟变为活动状态,所以RButtonRButton发送到 Firefox。

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

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

于 2012-04-25T11:05:50.597 回答