捕获右键单击+用autohotkey左键单击; 意外的行为

我想捕获按键的鼠标右键按下,然后按下鼠标左键。 在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,在其他应用程序中左右发送Y.
  • 但是, 每个应用程序都禁用右键单击

我在这里做错了什么?


编辑:

目标是这样的:我想要一个全局热键右键+左键单击RButton & LButton 。 在我testing兼容性的特定应用程序中,我想要右键+左键单击以禁止发送右键单击,然后使用autohotkey手动发送右键单击。 但是,由于某些应用程序可能在处理由~RButton & LButton时遇到麻烦,所以在所有未经testing的应用程序中,我想使用~RButton & LButton和〜来传递右键单击事件

Solutions Collecting From Web of "捕获右键单击+用autohotkey左键单击; 意外的行为"

这是一个支持右键拖动!

 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在被自己按下时失去原来的/ native函数。 为了避免这种情况,脚本可以配置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. 火狐不活跃,所以第二个变种被处理
  4. <延迟>( RButton被按下,尽管延迟可能不可察觉,按毫秒的顺序为无限)
  5. Firefox变得活跃
  6. <延迟>(仍然保持)
  7. 发送RButton ,根据文档发送RButton 。 由于Firefox在活动窗口检查和发送RButton之间的延迟时间变得活跃,所以RButton被发送到Firefox。

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

我试图通过在RButton热键中添加一个额外的IfWinNotActive检查来解决这个错误,但它似乎没有工作。