首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetWindowsHookEx失败,错误为126

SetWindowsHookEx失败,错误为126
EN

Stack Overflow用户
提问于 2013-07-27 12:09:01
回答 1查看 8.9K关注 0票数 21

我试图在一个项目中使用Gma.UserActivityMonitor库,但是我遇到了一个我自己无法克服的错误。

HookManager.Callbacks.cs文件中,有一个名为EnsureSubscribedToGlobalMouseEvents的静态方法,其代码如下(或多或少):

代码语言:javascript
复制
var asm = Assembly.GetExecutingAssembly().GetModules()[0];
var mar = Marshal.GetHINSTANCE(asm);
s_MouseHookHandle = SetWindowsHookEx(
    WH_MOUSE_LL,
    s_MouseDelegate,
    mar,
    0);
//If SetWindowsHookEx fails.
if (s_MouseHookHandle == 0)
{
    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. 
    int errorCode = Marshal.GetLastWin32Error();
    //do cleanup

    //Initializes and throws a new instance of the Win32Exception class with the specified error. 
    throw new Win32Exception(errorCode);
}

SetWindowsHookEx总是返回0,上面的代码总是抛出带有消息The specified module could not be found的异常,而对Marshal.GetLastWin32Error的调用则返回代码126。我可以成功地运行Gma.UserActivityMonitor的原始项目提供的演示,但是由于我的项目有点太复杂,无法在这里解释,所以我无法详细解释它与我的项目的不同之处。我只是希望有人能瞎猜这个问题。

顺便说一句,在该项目的FAQ中,有人说其他人在只有在项目调试时才检查Enable Visual Studio hosting process时,在我附近有一个问题(带有Enable Visual Studio hosting process返回错误)。因此,我取消了选中我的框,但我仍然有同样的问题,不仅在调试模式,而且当我双击Windows资源管理器中的发布文件(不涉及Visual )。

为了提供更多信息,在演示项目(工作得很好)中,asm变量指向{Gma.UserActivityMonitor.dll},在我的项目中抛出异常也是如此!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-27 13:07:54

这类代码不再适用于.NET 4和更高版本。您得到的错误代码是描述性的,126 =“找不到指定的模块”。它告诉您,"mar“变量包含垃圾。

.NET 4进行了相当重要的CLR更改,它不再假装抛出的代码存在于非托管模块中。因此,Marshal.GetHINSTANCE()不再工作了。然后代码变得草率,它忘记检查返回值,测试它的(IntPtr)-1是必需的,以检测失败和宣布灾难。对于您在Codeproject中发现的代码来说,很多错误和草率都是贡献者无法修复的。不是SO模型:)

对于低级别的钩子来说,SetWindowsHookEx()有点尴尬。它需要一个有效的模块句柄,并检查它,但实际上并不使用它。这个问题在Windows系统中得到了修复,就在Win7 SP1附近。虽然这无疑是一种有用的解决办法,但实际上却使问题变得更糟。因为现在它可以在你的开发机器上工作,而不是在你用户的机器上工作。

总之,修复很简单,你只需要拿出一个有效的模块句柄。您可以从托管应用程序中始终存在的模块中获得一个,您需要pinvoke LoadLibrary才能获得:

代码语言:javascript
复制
var mar = LoadLibrary("user32.dll");
s_MouseHookHandle = SetWindowsHookEx(
    WH_MOUSE_LL,
    s_MouseDelegate,
    mar,
    0);

不需要调用FreeLibrary(),该模块将一直加载,直到程序终止。

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17897646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档