旧版 .NET 版本中的全局鼠标事件处理程序故障排除
问题:
使用普通方法实现的全局鼠标事件处理程序在.NET Framework 4及更早版本中无法触发事件。
说明:
问题源于在 GetModuleHandle(curModule.ModuleName)
调用中使用 SetWindowsHookEx
。 在 .NET 4 及更早版本中,在 Windows 8 之前的 Windows 版本上,公共语言运行时 (CLR) 不会为托管程序集生成非托管模块句柄。 因此,GetModuleHandle(curModule.ModuleName)
返回无效句柄,从而阻止 SetWindowsHookEx
注册挂钩。
解决方案:
解决方案涉及向 SetWindowsHookEx
提供有效的模块句柄,即使对于低级鼠标钩子来说这并不是绝对必要的。 这是更正后的代码:
<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle("user32"), 0); if (hook == IntPtr.Zero) { throw new System.ComponentModel.Win32Exception(); }</code>
此修改后的代码获取 user32.dll
的句柄,这是一个在 .NET 应用程序中一致加载的模块。 这确保了 SetWindowsHookEx
的有效句柄。 如果函数调用失败,则通过抛出 Win32Exception
来改进错误处理。
以上是为什么我的全局鼠标事件处理程序在 .NET 4 及更早版本中不触发?的详细内容。更多信息请关注PHP中文网其他相关文章!