5

グローバル キーボード/マウス フックを使用するアプリケーションを開発しました。Windows 7 では完全に機能しますが、Windows XP では機能しません。

Windows XP で SetWindowsHookEx を呼び出すと、エラー コード 1428 が表示されます

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

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

1 に答える 1

12

このコードが Win7 で失敗しないことに興味がありますが、試したことはありません。しかし、それは正しい動作であり、改善されたようです。SetWindowsHookEx() の引数の検証には、ゼロ以外の有効な 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 を挿入する必要はありません。.NET 4 では、CLR が純粋なマネージ アセンブリのモジュール ハンドルを偽装しなくなったため、選択には注意が必要です。LoadLibrary("user32.dll") は常に既にロードされているため、ピンボークから得られるものを使用することをお勧めします。FreeLibrary() を呼び出す必要はありません。

LoadLibrary を呼び出すには、次の宣言が必要です。

[DllImport("kernel32", SetLastError=true, CharSet = CharSet.Auto)]
private static extern IntPtr LoadLibrary(string fileName);
于 2012-05-09T12:56:03.047 に答える