C# 除了低级钩子和原始输入之外,还有其他方法检测全局鼠标钩子吗?
我正在尝试检测全局鼠标点击,并使用C#在我的Windows桌面应用程序中移动 通过使用低级鼠标挂钩,我成功地做到了这一点。然而,它自己悄悄地脱钩了,我再也找不到它了 RawInput函数也不适用 那么,除了低级鼠标钩子和rawinput函数之外,还有其他方法检测全局鼠标钩子吗C# 除了低级钩子和原始输入之外,还有其他方法检测全局鼠标钩子吗?,c#,.net,C#,.net,我正在尝试检测全局鼠标点击,并使用C#在我的Windows桌面应用程序中移动 通过使用低级鼠标挂钩,我成功地做到了这一点。然而,它自己悄悄地脱钩了,我再也找不到它了 RawInput函数也不适用 那么,除了低级鼠标钩子和rawinput函数之外,还有其他方法检测全局鼠标钩子吗 private const int WH_MOUSE_LL = 14; private static Win32Interop.LowLevelHookProc _proc = HookCallback;
private const int WH_MOUSE_LL = 14;
private static Win32Interop.LowLevelHookProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
public static void Install()
{
_hookID = SetHook(_proc);
StartRehookTimer();
}
private static IntPtr SetHook(Win32Interop.LowLevelHookProc proc)
{
return Win32Interop.SetWindowsHookEx(WH_MOUSE_LL, proc, IntPtr.Zero, 0);
}
private static void StartRehookTimer()
{
Timer _timerClock = new Timer
{
Interval = 300000
};
_timerClock.Elapsed += OnTimer;
_timerClock.Enabled = true;
}
private static void OnTimer(object sender, ElapsedEventArgs e)
{
bool unhookSuccess = false;
if (_hookID != IntPtr.Zero)
{
// uninstall system-wide hook
unhookSuccess = Win32Interop.UnhookWindowsHookEx(_hookID);
_hookID = IntPtr.Zero;
}
_hookID = SetHook(_proc);
Debug.WriteLine("Unhook: Calling UnhookWindowsHookEx" + unhookSuccess + _hookID);
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 &&
MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
{
Debug.WriteLine("Mouse Down-----");
}
return Win32Interop.CallNextHookEx(_hookID, nCode, wParam, lParam);
}
请添加一个最小的可复制代码示例,以便有人能够提供帮助。您到底尝试了什么?也许你做错了。如果您显示代码并解释正在发生的事情(为什么您不能重新挂钩,您是否遇到异常或什么?),我们可能会帮助您“它会自动以静默方式解除挂钩”,添加每5分钟重新挂钩鼠标事件的代码,以便可以忽略静默解除挂钩的问题。但是,重新挂钩后不会调用回调函数,尽管unhooksuccess为true,并且重置挂钩时返回的指针不为零。请添加一个最小的可复制代码示例,以便有人提供帮助。您到底尝试了什么?也许你做错了。如果您显示代码并解释正在发生的事情(为什么您不能重新挂钩,您是否遇到异常或什么?),我们可能会帮助您“它会自动以静默方式解除挂钩”,添加每5分钟重新挂钩鼠标事件的代码,以便可以忽略静默解除挂钩的问题。但是,重新挂钩后不会调用回调函数,尽管unhooksuccess为true,并且重置挂钩时返回的指针不为零。