简单的条件传递

时间:2016-10-03 10:48:05

标签: windows mouseevent keyboard-shortcuts autohotkey key-bindings

想知道我是否可能遗漏了AHK中基本的东西:有没有办法对任何鼠标或键盘操作进行简单的条件传递,这样如果条件失败,操作就会通过?

类似的东西:

LButton::
if(WinActive("ahk_class Notepad")) {
    ; Do something cool
    }
else { 
     ; Pass through
     }

给我带来特别麻烦的是必须通过LButton的情况。最干净的"当左键单击是拖动操作的开始时,技术似乎失败(请参阅底部的非工作脚本)。我有一个解决方法,但它很冗长。

我尝试了什么

我有一个有效的解决方案,但它相当冗长。下面,我将其改编为一个简单的记事本示例,用于演示目的。演示脚本的作用:

  • 在记事本中,如果单击文本框,则会收到警报并且您的点击被禁用。但是,您可以单击菜单。
  • 其他地方,正常点击功能。

我还尝试过使用$修饰符无效的方法(请参见底部)。

备注

  • 该脚本使用Click Down而不是Click,否则拖动操作是不可能的。这些在实际的应用程序中是必需的,可以通过调整窗口大小在记事本中进行测试。
  • 我没有将LButton包裹在If WinActive中,因为“LButton Up”需要申请所有课程。为什么?当您从记事本转移到另一个应用程序时,单击向下通过记事本测试,但点击时失败,因为您现在在另一个窗口中。

工作脚本

#NoEnv  ; Recommended for all scripts. Avoids checking empty variables to see if they are environment variables.

LButton::
if(WinActive("ahk_class Notepad")) {
    MouseGetPos, x, y, ovw, control
    if(control = "Edit1") {
      SplashTextOn 300, 100, AutoHotkey Message, You can play with the menus`,`nbut not the text box. 
      Sleep 3000 
      SplashTextOff
      }
   else { ; pass the click through
        ; The reason we Click down is that a plain Click doesn't work
        ; for actions where hold the button down in order to drag.
        Click down
       }
   }
 else { 
      Click down
      }
Return

; The LButton section holds the down state, so we need to allow it Up
LButton Up::Click up  

使用$

的非工作脚本

这种方法不起作用,因为记事本窗口无法再调整大小:"传递"似乎是点击,而不是在需要时点击向下(拖动动作)。

#NoEnv  ; Recommended for all scripts. Avoids checking empty variables to see if they are environment variables.
#IfWinActive ahk_class Notepad
$LButton::
MouseGetPos, x, y, ovw, control
    if(control = "Edit1") {
        SplashTextOn 300, 100, AutoHotkey Message, You can play with the menus`,`nbut not the text box. 
        Sleep 3000 
        SplashTextOff
      }
     else {  ; pass the click through
             Send {LButton}
          }
Return
#IfWinActive

1 个答案:

答案 0 :(得分:2)

#If...指令用于在某些条件下仅使热键成为触发器。这当然意味着:如果不满足给定条件,则不会调用热键例程并且键将通过(并且它们将通过类似原生键事件)。

你的例子:

; $ prevents the hotkey from triggering itself
$LButton::
  if(WinActive("ahk_class Notepad")) {
      ; Do something cool
  } else { 
      ; Pass through
      Send, LButton
  }
return

可以很容易地写成:

#IfWinActive, ahk_class Notepad
LButton::
   ; Only the cool stuff goes here
return
#IfWinActive

更具针对您的问题,您还可以将#If与表达式结合使用,以确定arbritrary条件的组合,即检查用户是否尝试单击记事本中的文本框窗口:

#If WinActive("ahk_class Notepad") && MouseOver() = "Edit1"
LButton::
    SplashTextOn 300, 100, AutoHotkey Message, You can play with the menus`,`nbut not the text box. 
    Sleep 3000 
    SplashTextOff
Return
#If

MouseOver() {
    MouseGetPos, , , , curControl
    return curControl
}