b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

微软提供的有WH_MOUSE_LL和WH_KEYBOARD_LL的钩子来实现全局捕获

电脑杂谈  发布时间:2021-05-18 18:02:12  来源:网络整理

相关参考文件:

; en-us; 318804

使用低级挂钩来实现与全局捕获有关的操作。 Microsoft提供了两个低级钩子WH_MOUSE_LL和WH_KEYBOARD_LL,以捕获全局鼠标和全局键盘。借助SetWindowsHookEx,您可以设置特定的挂钩挂在全世界。

在Internet上的许多示例中,为了捕获鼠标双击动作,认为可以捕获消息WM_LBUTTONDBLCLK,并且该消息用于设置是否双击,但是在钩子之后实际上,Windows不会直接捕获WM_LBUTTONDBLCLK该消息是两条WM_LBUTTONDOWN消息。因此,如果要捕获双击,可以考虑计算两次单击之间的时间间隔,并将其与系统的双击时间间隔进行比较,以确定是否为双击。

在代码中引入系统的双击时间

c全局鼠标钩子_c 全局鼠标钩子_全局 非鼠标钩子

[DllImport("user32.dll")]
public static extern int GetDoubleClickTime();

设置一个静态变量以存储最后一次点击的时间,并设置一个静态变量以存储特定的点击次数

c 全局鼠标钩子_c全局鼠标钩子_全局 非鼠标钩子

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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...