找不到模块

时间:2010-05-05 15:46:47

标签: c# hook setwindowshookex

我一直在研究这个问题并且没有更接近解决方案。

我再次挖出了我的旧版WindowsHookLib - 它可以在http://www.codeproject.com/KB/DLL/WindowsHookLib.aspx获得。该库允许全局Windows鼠标/键盘/剪贴板挂钩,这非常有用。

我正在尝试使用此处的Mouse Hook捕获Mouse-Motion(我可以使用一个总是轮询Cursor.Position的Timer,但我打算稍后使用WindowsHookLib的更多功能。)

代码如下:

MouseHook mh = new MouseHook();
mh.InstallHook();
mh.MouseMove += new EventHandler<WindowsHookLib.MouseEventArgs>(mh_MouseMove);

但是在调用InstallHook()时,我得到一个异常:“无法找到指定的模块”。奇怪。在搜索中,我发现有人认为这是因为DLL不在Windows PATH变量中包含的地方,并且因为将它放在system32中并没有帮助我将整个程序转换为C#以直接包含在我的项目(我很好奇它是如何工作的)。

然而,错误是顽固的持久性,所以我对此进行了一些挖掘,并发现了负责的库中的代码:在InstallHook()中,我们有

IntPtr hinstDLL = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
this._hMouseHook = UnsafeNativeMethods.SetWindowsHookEx(14, this._mouseProc, hinstDLL, 0);
if (this._hMouseHook == IntPtr.Zero)
{
      throw new MouseHookException(new Win32Exception(Marshal.GetLastWin32Error()).Message);
}

这个(在修改和重新编译之后)告诉我,我真正得到的是Windows错误“ERROR_MOD_NOT_FOUND”!现在,我在这里难过。我不是直接将Hook Library编译成我的项目吗?

(UnsafeMethods.SetWindowsHookEx只是来自user32的DllImported方法)

任何答案,或正确方向的产品,或任何提示,指针或类似的非常感谢!

2 个答案:

答案 0 :(得分:11)

我发现在迁移到.NET 4.0时,当Hook过程在本地程序集中时,我必须在IntPtr.Zero中发送hMod参数。您可以在这里参考msdn文档。

http://msdn.microsoft.com/en-us/library/ms644990%28VS.85%29.aspx

答案 1 :(得分:1)

我也有这个问题。我发现它似乎与你正在使用的.Net版本有关。 .Net 4你得到这个错误,改成.Net 3.5就可以了。