想知道我是否可能遗漏了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
答案 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
}