AutoHotInterception,Interception,AutoHotkey,热键,钩子,(进阶篇)愿愿原创。

用一个案例,讲述,如何使用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) ;

谢谢关注,愿愿。

猜你喜欢

转载自blog.csdn.net/tom_xuzg/article/details/84189164