多击检测1号 := new 多击检测("a", "a_callBack")  ; 拦截并检测a键的多击情况,结果返回到函数 a_callBack()
多击检测2号 := new 多击检测("~b", "b_callBack") ; 检测b键的多击情况,结果返回到函数 b_callBack()

Sleep 5000

多击检测2号.Close() ; 必须手动调用 .Close() 方法关闭
多击检测2号 := ""
MsgBox 0x42030, 关闭热键演示, 多击检测2号已关闭
return

a_callBack(i) {
  ToolTip %i%击了a
}

b_callBack(i) {
  ToolTip %i%击了b
}

class 多击检测 {  ; By 空
  __New(key, fnCallback) {
    this.key        := key
    this.keystrokes := 0
    this.fnCallback := fnCallback
    boundFunc       := ObjBindMethod(this, "_Press")
    this.boundFunc  := &boundFunc
    Hotkey % this.key, % boundFunc
  }

  _Press() {
    if (this.keystrokes = 0) {
      boundFunc := ObjBindMethod(this, "_Checker")
      SetTimer % boundFunc, -400
    }
    this.keystrokes += 1
  }

  _Checker() {
    fnName := this.fnCallback
    %fnName%(this.keystrokes)
    this.keystrokes := 0
  }

  ; Hotkey 会保留 boundFunc 的引用,所以在 ObjRelease 前无法触发 __Delete(),所以只能手动释放
  Close() {
    Hotkey % this.key, Off
    ObjRelease(this.boundFunc)
  }
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。