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変数に含まれている場所にないため、誰かがこれが発生すると考えていたことがわかりました。また、DLLを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」であることを示しています。さて、ここで私は困惑しています。フックライブラリをプロジェクトに直接コンパイルしただけではありませんか?

(UnsafeMethods.SetWindowsHookExは、user32からのDllImportedメソッドにすぎません)

回答、正しい方向の製品、またはヒント、ポインタなどは非常に高く評価されています。

4

2 に答える 2

13

.NET 4.0に移行するときに、フックプロシージャがローカルアセンブリにあるときに、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このエラーが発生し、.Net3.5に変更すると機能します。

于 2010-06-14T13:18:15.640 に答える