SetWindowsHookEx возвращается с «Недопустимым дескриптором окна» после перехода на .net 4.0 - PullRequest
1 голос
/ 09 марта 2011

После перехода на .net 4.0 из 2.0 я не могу успешно запустить функцию SetWindowsHookEx. Он всегда заканчивается Win32 ошибочным номером 1400: "Invalid window handle".

Это подпись pinvoke:

[DllImport("user32.dll", SetLastError = true, EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi)]
public static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, int hModule, int dwThreadId);

Это звонок:

SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, iModule, 0);

Это работало раньше. В любом случае, почему он должен возвращаться с ошибкой «Неверный дескриптор окна»?

Кстати: в Windows 7 он работает, но только если я установил iModule = 0. В XP он все равно не работает.

1 Ответ

2 голосов
/ 09 марта 2011

Проблема решена:

Проблема была в iModule.Я назначил это так:

int iModule = System.Runtime.InteropServices.Marshal.GetHINSTANCE(
    System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0])
).ToInt32();

И правильный способ сделать это, по-видимому:

int iModule = System.Diagnostics.Process.GetCurrentProcess().MainModule.BaseAddress.ToInt32();

Но я буду рад узнать причину этого.Логически, GetModules () [0] дает сам файл dll, где находится функция обратного вызова, в то время как GetCurrentProcess (). MainModule.BaseAddress возвращает основной модуль (файл dll?), Который может отличаться от dll, которая содержит функцию обратного вызова.

Так почему же на самом деле это работает "наоборот" - в моем понимании?и как получилось, пока я не сменил версию .net?

...