我已经在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");
}
}