'鼠标钩子 ==================
'启动窗口中放：HookMouBoard
'关闭窗口中放：UnhookWindowsHookEx(MouseboardHandle)
'Function MouseboardCallback(ByVal Code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'    Dim HOOKSTRUCT(0 To 4) As Long
' nCode:指示挂钩类型
'若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数CallNextHookEx 并返回其返回值.  
'   If (Code = 0) Then
'    FF_MemCopy( lParam , VarPtr(HOOKSTRUCT(0)), 20 )
' ' ０没有按下 １左键　２右键　３中键 ４滚轮
' ' １按下　２放开
' '  鼠标钩子返回 Int((wParam - 510) / 3), (wParam - 512) Mod 3, HOOKSTRUCT(0), HOOKSTRUCT(1)
'  '鼠标钩子返回(鼠标键号 As Long, 键状态 As Long, X As Long, Y As Long)
'   End If
'   Function = CallNextHookEx(MouseboardHandle, Code, wParam, lParam)
'                                    '表示：如果前面的条件都不成立，那么说明这条消息并非我们需要的消息，
'                                    '此时我们将此消息释放，用CallNextHookEx交还给系统。
'End Function
'SetWindowsHookEx(
'  idHook: Integer;   {钩子类型}
'  lpfn: TFNHookProc; {函数指针}
'  hmod: HINST;       {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}
'  dwThreadId: DWORD  {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}
'): HHOOK;            {返回钩子的句柄; 0 表示失败}
'//钩子类型 idHook 选项:
'WH_MSGFILTER       = -1; {线程级; 截获用户与控件交互的消息}
'WH_JOURNALRECORD   = 0;  {系统级; 记录所有消息队列从消息队列送出的输入消息, 在消息从队列中清除时发生; 可用于宏记录}
'WH_JOURNALPLAYBACK = 1;  {系统级; 回放由 WH_JOURNALRECORD 记录的消息, 也就是将这些消息重新送入消息队列}
'WH_KEYBOARD        = 2;  {系统级或线程级; 截获键盘消息}
'WH_GETMESSAGE      = 3;  {系统级或线程级; 截获从消息队列送出的消息}
'WH_CALLWNDPROC     = 4;  {系统级或线程级; 截获发送到目标窗口的消息, 在 SendMessage 调用时发生}
'WH_CBT             = 5;  {系统级或线程级; 截获系统基本消息, 譬如: 窗口的创建、激活、关闭、最大最小化、移动等等}
'WH_SYSMSGFILTER    = 6;  {系统级; 截获系统范围内用户与控件交互的消息}
'WH_MOUSE           = 7;  {系统级或线程级; 截获鼠标消息}
'WH_HARDWARE        = 8;  {系统级或线程级; 截获非标准硬件(非鼠标、键盘)的消息}
'WH_DEBUG           = 9;  {系统级或线程级; 在其他钩子调用前调用, 用于调试钩子}
'WH_SHELL           = 10; {系统级或线程级; 截获发向外壳应用程序的消息}
'WH_FOREGROUNDIDLE  = 11; {系统级或线程级; 在程序前台线程空闲时调用}
'WH_CALLWNDPROCRET  = 12; {系统级或线程级; 截获目标窗口处理完毕的消息, 在 SendMessage 调用后发生}
Common Shared MouseboardHandle as HHOOK
Function HookMouBoard(ByVal TID as ULong) as HHOOK '定义鼠标钩子
   MouseboardHandle = SetWindowsHookEx(14, @MouseboardCallback, App.hInstance, TID)
   
   '1 钩子类型
   '2 回调函数地址
   '3 实例句柄
   '4 线程ID  =0 钩全部
   Function = MouseboardHandle
End Function