对 .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中文网其他相关文章!