首页 >后端开发 >C++ >为什么我的全局鼠标事件处理程序在 Windows 8 之前的系统上的 .NET 4 中没有触发?

为什么我的全局鼠标事件处理程序在 Windows 8 之前的系统上的 .NET 4 中没有触发?

Barbara Streisand
Barbara Streisand原创
2025-01-15 07:38:47489浏览

Why Isn't My Global Mouse Event Handler Firing in .NET 4 on Pre-Windows 8 Systems?

对 .NET 4(Windows 8 之前的版本)中的非触发全局鼠标事件处理程序进行故障排除

本文解释了为什么全局鼠标事件处理程序可能无法在早于 Windows 8 的操作系统上的 .NET Framework 4 中正常工作,并提供了解决方案。

代码说明

代码使用 SetWindowsHookEx API 创建全局鼠标钩子并定义 MouseAction 事件。 HookCallback 函数处理低级鼠标事件,在左键单击时引发 MouseAction 事件。

问题:SetWindowsHookEx失败

问题出在 SetWindowsHookEx 函数调用上。 在 Windows 8 之前的系统上,.NET 4 CLR 不会模拟托管程序集的非托管模块句柄。 这会导致 GetModuleHandle(用于获取当前程序集的句柄)失败,导致 SetWindowsHookEx 返回 IntPtr.Zero

缺少错误处理

原始代码缺乏关键的错误处理。 WinAPI 函数不会抛出异常; 您必须显式检查返回值。

解决方案:使用已知的模块句柄

修复涉及用已知的有效模块句柄替换 GetModuleHandle 调用。 由于 user32.dll 始终加载在 .NET 应用程序中,因此其句柄可以完美运行。

更正的代码片段

这是更正后的代码段:

<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle("user32"), 0);
if (hook == IntPtr.Zero)
{
    throw new System.ComponentModel.Win32Exception();
}
return hook;</code>

添加此错误检查并使用 user32.dll 句柄可确保 MouseAction 事件可靠触发,恢复预期的鼠标单击处理功能。

以上是为什么我的全局鼠标事件处理程序在 Windows 8 之前的系统上的 .NET 4 中没有触发?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn