1

こんにちは、助けようとする人に前もって感謝します。CBT Windows フックを設定しようとしています。これは、グローバルに設定するとうまく機能しますが、単一のスレッドにアタッチしようとすると失敗します。私が知る限り、私は本ですべてをやっています: - アンマネージ dll からフック プロシージャを公開しました - 私のアプリケーション、dll、およびスレッドのプロセスはすべて 32 ビットです - 私が使用するスレッド ID は正しいです (spy++ で確認)

C++ コードからスレッドを 1 つだけフックしようとしたところ、なんとか成功しました...アンマネージ コードからスレッドを 1 つだけフックできますか?

とにかくここに私のコードがあります:

[DllImport( "user32.dll", SetLastError = true )]
    static extern IntPtr SetWindowsHookEx ( int hookType, UIntPtr lpfn, IntPtr hMod, uint dwThreadId );

[DllImport( "kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true )]
    public static extern UIntPtr GetProcAddress ( IntPtr hModule, string procName );

[DllImport( "kernel32", SetLastError = true, CharSet = CharSet.Unicode )]
    public static extern IntPtr LoadLibrary ( string libraryName );

const int WH_CBT = 5;

    void SetHook ()
    {
        IntPtr dll = LoadLibrary( LIBRARY );
        UIntPtr proc = GetProcAddress( dll, PROC );
        uint threadId = GetAppWindowThreadId();
         //assume that the threadId of the external window is correct, as I said I verified with spy++
         //and assume that dll and proc both get correct values
        IntPtr hookAddress = SetWindowsHookEx( WH_CBT , proc, dll, threadId );
         //hookAddress is 0
    }
4

1 に答える 1

3
[DllImport( "user32.dll", SetLastError = true )]
static extern IntPtr SetWindowsHookEx ( int hookType, UIntPtr lpfn, 
                                        IntPtr hMod, ulong dwThreadId );

その宣言は間違っています。最後の引数 (dwThreadId) の型は、C# の uint である DWORD です。

それに関する PInvokeStackImbalance デバッガーの警告が表示されなかったのは奇妙です。これは、64 ビットのオペレーティング システムで実行していることを示しています。これにより、いくつかの追加の障害モードが追加されます。挿入する DLL には、プロセスとフックするプロセスの両方の正しいビット数にコンパイルされたアンマネージ コードが含まれている必要があります。必要に応じて、プロジェクトのプラットフォーム ターゲットを設定します。あなたのコードにはすべてのエラー チェックが欠けているため、なぜ機能しないのかわかりません。失敗のリターン コードを受け取った場合は、必ず new Win32Exception() をスローしてください。

于 2011-08-28T12:06:16.807 に答える