自.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.它无论如何都无法工作。
答案 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版本之前它是如何工作的?