SetWindowsHookEx не работает с идентификатором потока - PullRequest
0 голосов
/ 28 августа 2011

Здравствуйте и спасибо заранее всем, кто постарается помочь. Я пытаюсь установить хук окон CBT, который работает хорошо, когда я устанавливаю его глобально, но не удается всякий раз, когда я пытаюсь присоединить его к одному потоку. Насколько я знаю, я делаю все по книге: - Я выставил процедуру подключения с неуправляемой DLL - мое приложение, DLL и процесс потока все 32-битные - Идентификатор потока, который я использую, является правильным (подтверждено spy ++)

Когда я пытался подключить только один поток из кода C ++, мне удалось это сделать ... вы можете подключить один поток только из неуправляемого кода?

вот мой код в любом случае:

[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
    }

1 Ответ

3 голосов
/ 28 августа 2011
[DllImport( "user32.dll", SetLastError = true )]
static extern IntPtr SetWindowsHookEx ( int hookType, UIntPtr lpfn, 
                                        IntPtr hMod, ulong dwThreadId );

Это заявление неверно.Тип последнего аргумента (dwThreadId) - DWORD, uint в C #.

Странно, что вы не получили предупреждение отладчика PInvokeStackImbalance об этом.Это говорит о том, что вы работаете в 64-битной операционной системе.Что добавляет несколько дополнительных режимов сбоя, DLL, которую вы вводите, должен содержать неуправляемый код, скомпилированный с правильной разрядностью как вашего процесса, так и процесса, который вы хотите перехватить.Установите целевую платформу вашего проекта по мере необходимости.В вашем коде отсутствует вся проверка ошибок, поэтому вы не будете знать, почему она не работает. Обязательно добавьте новую Win32Exception (), когда получите код возврата ошибки.

...