相关参考文件:
; en-us; 318804
使用低级挂钩来实现与全局捕获有关的操作。 Microsoft提供了两个低级钩子WH_MOUSE_LL和WH_KEYBOARD_LL,以捕获全局鼠标和全局键盘。借助SetWindowsHookEx,您可以设置特定的挂钩挂在全世界。
在Internet上的许多示例中,为了捕获鼠标双击动作,认为可以捕获消息WM_LBUTTONDBLCLK,并且该消息用于设置是否双击,但是在钩子之后实际上,Windows不会直接捕获WM_LBUTTONDBLCLK该消息是两条WM_LBUTTONDOWN消息。因此,如果要捕获双击,可以考虑计算两次单击之间的时间间隔,并将其与系统的双击时间间隔进行比较,以确定是否为双击。
在代码中引入系统的双击时间
[DllImport("user32.dll")] public static extern int GetDoubleClickTime();
设置一个静态变量以存储最后一次点击的时间,并设置一个静态变量以存储特定的点击次数
static DateTime lastClickTime;
static clickCount;
在鼠标挂钩回调函数中,计算两次单击之间的时间间隔以区分是否是双击,并且合理地使用clickCount以避免在执行三次快速单击时被识别为双击。
private int CallBackMouseHookProc(int nCode, int wParam, IntPtr lParam) { if (nCode < 0) { CallNextHookEx(mshHook, nCode, wParam, lParam); } MOUSEHOOKSTRUCT mouseHookStruct = (MOUSEHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MOUSEHOOKSTRUCT)); MouseButtons mouseButton = MouseButtons.None; switch (wParam) { case (int)MsgType.WM_LBUTTONDOWN: mouseButton = MouseButtons.Left; break; case (int)MsgType.WM_RBUTTONDOWN: mouseButton = MouseButtons.Right; break; case (int)MsgType.WM_MOUSEMOVE: clickCount = 0; break; default: break; } if (mouseButton == MouseButtons.Left) { System.TimeSpan deltaMs = DateTime.Now - lastClickTime; lastClickTime = DateTime.Now; if (deltaMs.TotalMilliseconds <= GetDoubleClickTime()) { clickCount++; } else { clickCount = 1; } if (clickCount == 2) { MouseEventArgs e = new MouseEventArgs( mouseButton, clickCount, mouseHookStruct.pt.x, mouseHookStruct.pt.y, 0); clickCount = 0; OnMouseDoubleClick(this, e); } } return CallNextHookEx(mshHook, nCode, wParam, lParam); }
更准确的是,它还需要在鼠标移动时取消上一次计算,并且不会在双击中计算
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-376378-1.html
面粉也生虫子
肯定不会让我们失望的