.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 环境中不会返回有效句柄。
该解决方案涉及两个关键改进:
强大的错误处理: 实施检查以确保 GetModuleHandle
和 SetWindowsHookEx
返回有效的句柄(而不是 IntPtr.Zero
)。 如果任一调用失败,则应抛出 Win32Exception
以提供信息性错误详细信息。
虚拟模块句柄: 对于低级鼠标钩子 (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中文网其他相关文章!