用一个案例,讲述,如何使用AutoHotInterception,以及Interception,关于如何安装,基本的使用规则,请翻看本博客其他内容。
首先,本文所述的Interception,是一个拦截键盘或者鼠标的驱动。当我们定义热键,如果非必要,尽可能的使用非阻塞型订阅模式,比如:如下代码(AutoHotkey代码)
AHI.SubscribeMouseButton(Mouseid, 0, false, Func("LBUTTON_KeyEvent"))
LBUTTON_KeyEvent(state)
{
global
static LastState:=0 ;连续两次进入不发送q键
;不拦截该事件传给windows,懒惰模式
if(false=SniperlogicFlag or false=IsOpenGlass) ;如果没有狙击信号,则不进行任何操作
{
return ;
}
else ;若有狙击信号,则进行下一步
{
if(LastState=state) ;如果按键为连续相同按键包括0和1,则不进行重复操作,不同状态时,进入操作
{
return ;
}
else
{
LastState:=state
if(LastState<>state) ;如果一个按键线程同时进来了这个else-if语句块,则排斥后进来的。
{
return ;
}
AHI.SendKeyEvent(idBlacksilk, qSC, state)
if(state=0)
{
SniperlogicFlag:=false ;狙击完设置狙击信号归位。
return ;
}
}
}
}
由于如果在以上代码中使用了,阻塞型的订阅模式,那么就需要考虑诸多因素,稍有不慎,鼠标的功能会完全被阻塞,幸运的情况下,windows的鼠标按键会发挥不正常,所以,我们尽可能的,不影响windows处理消息。
再看一个案例,我们如何测试按键被连击了呢。如下代码:
;以下函数是鼠标侧键的回调钩子函数
LCtrl_KeyEvent(state){
static LCtrllogicFlag:=true ;用来得到连续两次侧键点击之间的时间间隔
static FirstTime:=0 ;
static SecondTime:=0 ;
if(false= Enable_LCtrl_KeyEvent)
{
return ;
}
if (0= state) ;0代表放开,1代表按下
{
if(true=LCtrllogicFlag)
{
LCtrllogicFlag:=false ;
FirstTime:= A_TickCount ;
}
else
{
LCtrllogicFlag:=true ;
SecondTime:= A_TickCount ;
}
if(Abs(FirstTime-SecondTime)<366) ;判断是否双击,如果是,狙击热键配置标志,设置为关闭状态
{
SniperlogicFlag:=false ;
IsOpenGlass:=false ;
;向用户展示提示,保持1秒。
ToolTip, c, 1000, 800
SetTimer, RemoveToolTip, 1000
}
else
{
IsOpenGlass:=true ;
SniperlogicFlag:=true ;
;向用户展示提示,保持1秒。
ToolTip, f, 1000, 800
SetTimer, RemoveToolTip, 1000
}
}
}
对于键盘消息,因为,对于某个不常用的键,实时性要求不是很高,所以,不必追求,阻塞或者非阻塞。
对于多余的按键,比如联想m300鼠标的,应用窗口热键。我们可以直接禁用。如下代码:
AHI.SubscribeKey(id1, GetKeySC("LAlt"), true, Func("NULL_Event"))
AHI.SubscribeKey(id1, GetKeySC("Tab"), true, Func("NULL_Event"))
NULL_Event(state)
{
return ;
}
在AutoHotInterception的回调函数中,往往不能用autohotkey函数,比如sleep命令。我们可以这样使用,如下代码:
global SleepProc := DllCall("GetProcAddress", Ptr, DllCall("GetModuleHandle", Str, "kernel32", "Ptr"), AStr, "Sleep", "Ptr")
DllCall(SleepProc,Int,36) ;
谢谢关注,愿愿。