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

为什么我的全局鼠标事件处理程序在 Windows 8 之前的系统上的 .NET 4 中没有触发?

Barbara Streisand
发布: 2025-01-15 07:38:47
原创
488 人浏览过

Why Isn't My Global Mouse Event Handler Firing in .NET 4 on Pre-Windows 8 Systems?

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

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