积极答复者
Hook里的SetWindowsHookEx在64位系统中有什么不一样吗?

问题
-
最近突然对Hook很感兴趣,就写了个屏幕挂机的小程序来做实验,结果发现问题来了,那个SetWindowsHookEx在32位系统中能成功,但是在64位系统中就失败了。
部分代码如下:
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { KeyMSG m = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG)); switch ((Keys)m.vkCode) { case Keys.LWin: case Keys.RWin: case Keys.Delete: case Keys.Alt: case Keys.Escape: case Keys.F4: case Keys.Control: case Keys.Tab: return 1; } return 0; } /// <summary> /// 安装Hook /// </summary> private void InstallHook() { if (hKeyboardHook == 0) { KeyboardHookProcedure = new HookProc(KeyboardHookProc); hKeyboardHook = SetWindowsHookEx(13, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); if (hKeyboardHook == 0) { Console.WriteLine("Hook Install failed!"); } else Console.WriteLine("Hook Install succeeded!"); } }
在我64位系统里,Console总是显示失败!
求大虾解答!
答案
-
Hi Qiaoqiao,
因为你Hook的进程如果是64位的,所以它调用的Dll也应该是64位的。你需要生成你的程序为X64或者是AnyCPU。(右键单击项目名称à“属性”à“生成”à在平台中选择X64\AnyCPU)。
- 已标记为答案 Leo Liu - MSFTModerator 2011年3月15日 2:24
全部回复
-
SetWindowsHookEx can be used to inject a DLL into another process. A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process. If an application requires the use of hooks in other processes, it is required that a 32-bit application call SetWindowsHookEx to inject a 32-bit DLL into 32-bit processes, and a 64-bit application call SetWindowsHookEx to inject a 64-bit DLL into 64-bit processes. The 32-bit and 64-bit DLLs must have different names.
-
Hi Qiaoqiao,
因为你Hook的进程如果是64位的,所以它调用的Dll也应该是64位的。你需要生成你的程序为X64或者是AnyCPU。(右键单击项目名称à“属性”à“生成”à在平台中选择X64\AnyCPU)。
- 已标记为答案 Leo Liu - MSFTModerator 2011年3月15日 2:24
-
谢谢你的回答!但是我属性——生成——目标平台里设置了AnyCPU或者X64好像还是失败,那个配置里是活动(Debug),旁边的平台:活动(X86),那个活动(X86)没有其他选项
建个新项目看看,应该有X64选项
http://feiyun0112.cnblogs.com/