首页 >后端开发 >C++ >为什么我的全局鼠标事件处理程序在 .NET 4 及更早版本中不触发?

为什么我的全局鼠标事件处理程序在 .NET 4 及更早版本中不触发?

Barbara Streisand
Barbara Streisand原创
2025-01-15 07:59:59777浏览

Why Doesn't My Global Mouse Event Handler Fire in .NET 4 and Earlier Versions?

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

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