使用低级鼠标事件处理鼠标事件时,将鼠标减慢几秒钟的时间

时间:2020-03-03 11:42:00

标签: c# wpf hook

我已经在WPF应用程序中使用c#来处理鼠标事件,我们正在使用Windows全局Hook事件,即低级别事件,每当引发鼠标事件(如单击)时,鼠标事件就会减慢鼠标几秒钟的时间。即使我的应用程序已最小化,我也需要处理鼠标事件,因此我在使用低级挂钩事件,即WH_MOUSE_LL。降低鼠标速度的时间有所不同。谁能帮我解决这个问题。


/* I have used three classes to do this */


public class WindowsHookHelper
{
    public delegate IntPtr HookDelegate(
    Int32 Code, IntPtr wParam, IntPtr lParam);
    [DllImport("User32.dll")]
    public static extern IntPtr CallNextHookEx(
    IntPtr hHook, Int32 nCode, IntPtr wParam, IntPtr lParam);
    [DllImport("User32.dll")]
    public static extern IntPtr UnhookWindowsHookEx(IntPtr hHook);
    [DllImport("User32.dll")]
    public static extern IntPtr SetWindowsHookEx(
    int idHook, HookDelegate lpfn, IntPtr hmod,
    int dwThreadId);
}


/*This creates the mouse events delegate for registering mouse events like click and movement.*/

public class MouseInput : IDisposable
{
    public event EventHandler<EventArgs> MouseMoved;
    public event EventHandler<EventArgs> MouseClicked;
    private readonly WindowsHookHelper.WindowsHookHelper.HookDelegate _mouseDelegate;
    private IntPtr _mouseHandle;
    private const Int32 WH_MOUSE_LL = 14;
    private bool _disposed;
    public MouseInput()
    {
        _mouseDelegate = MouseHookDelegate;
        _mouseHandle = WindowsHookHelper.WindowsHookHelper.SetWindowsHookEx(WH_MOUSE_LL, _mouseDelegate, IntPtr.Zero, 0);
    }
    private IntPtr MouseHookDelegate(int code, IntPtr wParam, IntPtr lParam)
    {
        try
        {
            if (MouseMoved != null && MouseClicked != null)
            {
                if (code < 0)
                    return WindowsHookHelper.WindowsHookHelper.CallNextHookEx(_mouseHandle, code, wParam, lParam);
                if (wParam == (IntPtr)0x0200)
                    MouseMoved(this, new EventArgs());
                else if (wParam == (IntPtr)0x0201 || wParam == (IntPtr)0x0203 || wParam == (IntPtr)0x0204 || wParam == (IntPtr)0x0206 || wParam == (IntPtr)0x0209 || wParam == (IntPtr)0x0207)
                    MouseClicked(this, new EventArgs());
                return WindowsHookHelper.WindowsHookHelper.CallNextHookEx(_mouseHandle, code, wParam, lParam);
            }
            return WindowsHookHelper.WindowsHookHelper.CallNextHookEx(_mouseHandle, code, wParam, lParam);
        }
        catch (Exception exception)
        {
            return WindowsHookHelper.WindowsHookHelper.CallNextHookEx(_mouseHandle, code, wParam, lParam);
        }
    }
    public void Dispose()
    {
        Dispose(true);
    }
    protected virtual void Dispose(bool _disposed)
    {
        if (!_disposed)
        {
            if (_mouseHandle != IntPtr.Zero)
                WindowsHookHelper.WindowsHookHelper.UnhookWindowsHookEx(_mouseHandle);
            _disposed = true;
        }
    }
    ~MouseInput()
    {
        Dispose(false);
    }
}


/* Basic class to initiate the mouse events*/

public class GetMouse
{
    private MouseInput.MouseInput _mouse;

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
    [DllImport("user32")]
    public static extern IntPtr GetDesktopWindow();

    GetMouse()
    {
        _mouse = new MouseInput.MouseInput();
    }

    public void GetMouseEvent(object sender, DoWorkEventArgs e)
    {
        Task.Run(() =>
        {
            _mouse.MouseMoved += MouseMoved;
            _mouse.MouseClicked += MouseClicked;
        }
    }

    private void MouseMoved(object sender, EventArgs e)
    {
        Console.WriteLine("Mouse moved");
    }

    private void MouseClicked(object sender, EventArgs e)
    {
        Console.WriteLine("Mouse clicked");
    }

}

0 个答案:

没有答案
相关问题