自从移动到.net 4.0以来,SetWindowsHookEx返回“无效的窗口句柄”

时间:2011-03-09 14:36:44

标签: .net-4.0 c#-4.0 pinvoke

.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);

以前工作过。为什么它会以“无效的窗口句柄”错误返回?

btw:在Windows 7上它可以工作,但只有在XP上设置iModule = 0.它无论如何都无法工作。

1 个答案:

答案 0 :(得分:2)

问题解决了:

问题在于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版本之前它是如何工作的?