捕捉右键+左键点击在AutoHotkey; 意外的行为(capturing right-clic

2019-07-29 03:36发布

我想捕捉的关键事件“按下鼠标右键,然后鼠标左键按下”。 在AutoHotkey的没问题。 但是我有仍允许右鼠标键单独工作的麻烦。

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,在其他应用中左右将ÿ
  • 但是,用鼠标右键单击在每个应用程序禁用

我在做什么错在这里?


编辑:

我们的目标是这样的:我要上右键+左键单击一个全局热键RButton & LButton 。 在我所兼容性测试特定的应用,我想右键+左键,可以停止发送右键单击,然后发送手动使用的AutoHotkey单击鼠标右键。 然而,由于一些应用程序可能必须通过AutoHotkey的发送麻烦处理mouseevents中,我想用所有未测试的应用程序~RButton & LButton与〜传递throught右键单击事件

Answer 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


老东西

见的符号文档 (重点煤矿):

您可以通过使用“&”在它们之间形成两个按键(除了操纵杆按钮)的自定义组合。 在下面的例子中,你按住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按照文档。 由于火狐在活动窗口中检查之间的延迟变得活跃起来,当RButton发送, RButton发送到Firefox浏览器。

这发生在Firefox和另一个窗口是可见的,其他窗口是在点击时的活跃之一。

我试图通过增加一个额外来修复这个bug IfWinNotActive的内部检查RButton热键,但它似乎没有工作。



文章来源: capturing right-click+left-click with autohotkey; unexpected behaviour