При обработке событий мыши с использованием низкоуровневых событий мыши, замедление мыши на несколько секунд - PullRequest
0 голосов
/ 03 марта 2020

Я использовал c# в приложении WPF, чтобы обрабатывать события мыши, которые мы используем 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");
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...