При обработке событий мыши с помощью низкоуровневых событий мыши замедляет работу мыши на несколько секунд
Я использовал c# в приложении WPF, чтобы обрабатывать события мыши мы используем события глобального крючка windows, то есть низкоуровневые события, когда возникает событие мыши, например щелчок, оно замедляет мышь на несколько секунд. Мне нужно обрабатывать события мыши, даже если мое приложение свернуто, поэтому я использую низкоуровневое событие крючка, то есть WH_MOUSE_LL. Время замедления мыши меняется. может ли кто-нибудь помочь мне в решении этого вопроса?
Что я уже пробовал:
<pre>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"); } }