【问题标题】:SetWindowsHookEx failing on beta2 x64SetWindowsHookEx 在 beta2 x64 上失败
【发布时间】:2009-10-22 20:14:08
【问题描述】:

唉,我有一些来自 codeproject (http://www.codeproject.com/KB/cs/globalhook.aspx) 的代码,用于挂钩全局键盘和鼠标事件。突然间,当我安装了 Visual Studio 2010 的 beta 2 和 .net framework 4.0 时,我在这段代码中中断了:

            hKeyboardHook = SetWindowsHookEx(
                WH_KEYBOARD_LL,
                KeyboardHookProcedure,
                Marshal.GetHINSTANCE(
                Assembly.GetExecutingAssembly().GetModules()[0]),
                0);

哦,我在 X64 机器上运行。有人知道解决这个问题的方法吗?我知道这不是一个容易解决的问题..

【问题讨论】:

  • Break = crash 或 NULL hook 或 ... ?
  • 您在上面的代码中遇到编译器错误?这是什么?
  • 本身不是错误,hKeyboardHook 设置为 0,Marshal.GetLastWin32Error();也设置为 0。另一个用户收到“错误代码 #87 (-2147467259) 正在传递给 Win32Exception,并且由于出现“参数不正确”错误而失败。”但不是我好奇:/

标签: .net pinvoke 64-bit


【解决方案1】:

最近刚刚为我的项目做了这个。它就像一个魅力) 我几乎可以肯定这是关于第二和第三个论点。

1 像这样包装 KeyboardHookProcedure():

//declate delegate type:
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);

//use a class member of this type and inject your callback into
m_hookproc = new HookProc(HookCallbackProcedure);

2 代表第三个参数:

IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);

3 小心 Marshal.GetLastWin32Error() 你必须严格按照检查错误的方法使用它。 (see this fxcop rule)

然后整个画面是这样的:

IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
IntPtr handle = SetWindowsHookEx(   WH_KEYBOARD_LL, m_hookproc, hInstance,  0);
if (handle == IntPtr.Zero)
{
  int  error = Marshal.GetLastWin32Error();
  //log the error or whatever
}

就是这样)

【讨论】:

    【解决方案2】:

    将Instance参数保留为0。似乎XP需要它,但win7不需要。

    hKeyboardHook = SetWindowsHookEx(
                    WH_KEYBOARD_LL,
                    KeyboardHookProcedure,
                    0,
                    0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多