在beta2 x64上SetWindowsHookEx失败

时间:2009-10-22 20:14:09

标签: .net pinvoke 64-bit

叹了口气,我有一些来自codeproject(http://www.codeproject.com/KB/cs/globalhook.aspx)的代码用于挂钩全局键盘和鼠标事件。突然之间,当我安装了visual studio 2010和.net framework 4.0的beta 2时,我打破了这段代码:

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

哦,我正在使用X64机器。有人知道解决这个问题吗?我知道这不是一个简单的解决方案..

2 个答案:

答案 0 :(得分:0)

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

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
}

所以这就是全部)

答案 1 :(得分:0)

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

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