5

我一直在研究这个问题,但还没有接近解决方案。

我再次挖出了 WindowsHookLib 的旧副本 - 它的源代码位于http://www.codeproject.com/KB/DLL/WindowsHookLib.aspx。这个库允许全局 Windows 鼠标/键盘/剪贴板挂钩,这非常有用。

我正在尝试使用此处的鼠标钩来捕获鼠标运动(我可以使用始终轮询 Cursor.Position 的计时器,但我计划稍后使用 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 方法)

非常感谢任何答案,或正确方向的刺激,或任何提示,指针或类似的东西!

4

2 回答 2

13

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

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

于 2010-11-18T18:03:19.793 回答
1

我也有这个问题。我发现这似乎与您使用的 .Net 版本有关。.Net 4 出现此错误,更改为 .Net 3.5 即可。

于 2010-06-14T13:18:15.640 回答