我想捕捉的关键事件“按下鼠标右键,然后鼠标左键按下”。 在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右键单击事件
这里有一个支持右键拖动!
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的第二个:
- 另一个窗口被激活
-
RButton
下来发送 - Firefox是不活跃的,所以第二个变体被处理
- <延迟>(
RButton
被保持下来,尽管延迟时间可能是不可察觉的,在毫秒的数量级,到无穷大) - 火狐变得活跃
- <延迟>(仍保持向下)
-
RButton
向上被发送,它发送RButton
按照文档。 由于火狐在活动窗口中检查之间的延迟变得活跃起来,当RButton
发送, RButton
发送到Firefox浏览器。
这发生在Firefox和另一个窗口是可见的,其他窗口是在点击时的活跃之一。
我试图通过增加一个额外来修复这个bug IfWinNotActive
的内部检查RButton
热键,但它似乎没有工作。