当前位置: 首页 > 编程语言 > C#

SetWindowsHookEx失败并出现错误126分享

时间:2023-04-10 22:46:35 C#

SetWindowsHookEx失败并出现错误126在HookManager.Callbacks.cs文件中有一个名为EnsureSubscribedToGlobalMouseEvents的静态方法,代码如下(或多或少):varasm=Assembly.GetExecutingAssembly().GetModules()[0];varmar=Marshal.GetHINSTANCE(asm);s_MouseHookHandle=SetWindowsHookEx(WH_MOUSE_LL,s_MouseDelegate,mar,0);//如果SetWindowsHookEx失败。if(s_MouseHookHandle==0){//返回最后一个使用设置了D.SetLastError标志的平台Ivoke调用的非托管函数返回的错误代码。interrorCode=Marshal.GetLastWin32Error();//执行清理//初始化并抛出具有指定错误的Win32Exception类的新实例。抛出新的Win32Exception(errorCode);}SetWindowsHookEx始终返回0及以上代码不断抛出异常消息找不到指定的模块,对Marshal.GetLastWin32Error的调用返回代码126。原Gma.UserActivityMonitor项目提供的demo我可以成功运行,但是由于我的项目有点太复杂无法解释,我无法详细解释它与我的有何不同。我只是希望有人能盲猜这个问题。顺便说一句,在项目的常见问题解答中,其他人在仅在调试项目时选中启用VisualStudio托管进程时遇到了一个接近我的问题(使用SetWindowsHookEx返回错误)。所以我取消选中我的那个框,但我仍然有同样的问题,不仅在调试模式下,而且当我在Windows资源管理器中双击发布文件时(不涉及VisualStudio)。为了提供更多信息,在演示项目(工作正常)中,asm变量指向{Gma.UserActivityMonitor.dll}并且在我的项目中抛出异常!这种代码不再适用于.NET4及更高版本。您得到的错误代码是描述性的,126=“找不到指定的模块”。这告诉您“mar”变量包含垃圾。.NET4有一个非常重要的CLR变化,它不再假装非托管模块中存在jitted代码。所以Marshal.GetHINSTANCE()不再起作用了。然后代码变得马虎,它忘记检查返回值,测试它(IntPtr)-1是检测故障和宣告灾难所必需的。你在Codeproject上找到的代码很常见,有很多错误和草率,贡献者无法修复。不是SO模型:)SetWindowsHookEx()对于低级挂钩来说有点笨拙。它需要一个有效的模块句柄,并检查它,但实际上并不使用它。这已在Win7SP1周围的Windows中修复。虽然这当然是一个有用的解决方案,但它实际上使问题变得更糟。因为现在它可以在您的开发机器上运行,但不能在用户的机器上运行。Anyhoo,修复很简单,你只需要咳出一个有效的模块句柄。您可以从托管应用程序中始终存在的模块中获取模块,您需要调用LoadLibrary来获取它:varmar=LoadLibrary("user32.dll");s_MouseHookHandle=SetWindowsHookEx(WH_MOUSE_LL,s_MouseDelegate,mar,0);无需调用FreeLibrary(),模块将保持加载状态直到程序终止。以上就是C#学习教程:SetWindowsHookEx失败,错误126,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: