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

为什么我的全局鼠标事件处理程序在旧版 Windows 上的 .NET 4 中没有触发?

DDD
发布: 2025-01-15 06:55:43
原创
414 人浏览过

Why Isn't My Global Mouse Event Handler Firing in .NET 4 on Older Windows?

.NET 4(旧版 Windows)中的全局鼠标事件处理程序故障排除

问题:

使用 .NET 4 时,旨在捕获鼠标事件的自定义鼠标钩子在旧版 Windows 系统上无法按预期运行。订阅的事件处理程序保持不活动状态。

解决方案:

此行为源于 Windows 8 之前的操作系统上 .NET 4 公共语言运行时 (CLR) 的更改。 CLR 不再自动为托管程序集生成非托管模块句柄。 此外,原始代码中错误处理不足加剧了问题。

最初的 SetWindowsHookEx 调用可能如下所示:

<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0);</code>
登录后复制

这在较旧的 Windows 版本上会失败,因为 GetModuleHandle(curModule.ModuleName) 在 .NET 4 环境中不会返回有效句柄。

该解决方案涉及两个关键改进:

  1. 强大的错误处理: 实施检查以确保 GetModuleHandleSetWindowsHookEx 返回有效的句柄(而不是 IntPtr.Zero)。 如果任一调用失败,则应抛出 Win32Exception 以提供信息性错误详细信息。

  2. 虚拟模块句柄: 对于低级鼠标钩子 (WH_MOUSE_LL),不直接使用传递给 SetWindowsHookEx 的模块句柄。 因此,可以替换一个现成的句柄,例如 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();
}</code>
登录后复制

此更正后的代码可确保正确的错误处理并提供可靠的处理,解决了 .NET 4 下与旧 Windows 版本的不兼容性问题。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板