2012-05-09 20 views
5

グローバルキーボード/マウスフックを使用するアプリケーションを開発しました。これは、Windows 7では完璧に機能しますが、Windows XPでは機能しません。Windows XPではSetWindowsHookExを使用したが、Windows 7では使用しないときのエラー

私は、Windows XPには、SetWindowsHookExを呼び出すと、私は、エラーコード1428

int MouseLowLevel = 14 
int code = SetWindowsHookEx(MouseLowLevel, 
       MouseHookProc, 
       IntPtr.Zero, 
       0); 

private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) {} 

答えて

11

このコードは、Win7の上で失敗しませんが、私は確かに試したことがないという好奇心を取得します。しかし、それは彼らがそれを改善したように見える正しい動作です。 SetWindowsHookEx()の引数の検証には、0以外の有効な第3引数または第4引数が必要です。エラーコードはWINERROR.Hから、非常にわかりやすいです:

// 
// MessageId: ERROR_HOOK_NEEDS_HMOD 
// 
// MessageText: 
// 
// Cannot set nonlocal hook without a module handle. 
// 
#define ERROR_HOOK_NEEDS_HMOD   1428L 

それは実際に低レベルのフックのために使用されませんので、任意のモジュールハンドルが行いますが、何のDLLは、それらを動作させるために注入する必要はありません。 CLRは純粋に管理されたアセンブリのモジュールハンドルを偽装しないため、.NET 4では1つを選択する際に注意が必要です。 LoadLibrary( "user32.dll")は、常に読み込まれているため、抜け落ちてしまうのが良いでしょう。 FreeLibrary()を呼び出す必要はありません。

あなたはLoadLibrary関数を呼び出すために、この宣言をする必要があります:

[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)] 
private static extern IntPtr LoadLibrary(string fileName); 
+0

は、優れた応答をありがとうございました。今はWindows 7とXPの両方で動作します。 – magol

+2

コードに別のバグがあります。SetWindowsHookEx()の戻り値の型はintではなくIntPtrです。 –

+0

おっと、私はコードを簡略化していくつかのエラーを出しました。実際のコードでは、SafeHandleZeroOrMinusOneIsInvalidから継承するクラスを使用します。しかし、私はコードを添付するときにあまり詳細を望んでいませんでした。 しかし、とにかく感謝します:-) – magol