none
Hook里的SetWindowsHookEx在64位系统中有什么不一样吗? RRS feed

  • 问题

  • 最近突然对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总是显示失败!

    求大虾解答!

    2011年3月9日 6:14

答案

  • Hi Qiaoqiao,

    因为你Hook的进程如果是64位的,所以它调用的Dll也应该是64位的。你需要生成你的程序为X64或者是AnyCPU。(右键单击项目名称à“属性”à“生成”à在平台中选择X64\AnyCPU)。

    2011年3月10日 8:46

全部回复

  • 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.
    2011年3月9日 6:41
  • How to set the SetWindowsHookEx?
    2011年3月9日 7:26
  • 怎么写那个Hook呢?求解?
    2011年3月9日 8:40
  • Hi Qiaoqiao,

    因为你Hook的进程如果是64位的,所以它调用的Dll也应该是64位的。你需要生成你的程序为X64或者是AnyCPU。(右键单击项目名称à“属性”à“生成”à在平台中选择X64\AnyCPU)。

    2011年3月10日 8:46
  • 谢谢你的回答!但是我属性——生成——目标平台里设置了AnyCPU或者X64好像还是失败,那个配置里是活动(Debug),旁边的平台:活动(X86),那个活动(X86)没有其他选项
    2011年3月10日 9:29
  • 谢谢你的回答!但是我属性——生成——目标平台里设置了AnyCPU或者X64好像还是失败,那个配置里是活动(Debug),旁边的平台:活动(X86),那个活动(X86)没有其他选项

    建个新项目看看,应该有X64选项
    http://feiyun0112.cnblogs.com/
    2011年3月11日 1:14
    版主
  • 我已经搞定了,在SetWindowsHookEx的第三个参数写成(IntPtr)0就可以了

    谢谢大家的帮忙

    2011年3月15日 2:26
  • 相比32位只做了这么一个更改是吗?还是结合着属性里的更改?
    2013年10月12日 7:16