2009-10-22 80 views
0

叹息,我从代码项目(http://www.codeproject.com/KB/cs/globalhook.aspx)的一些代码挂钩全局键盘和鼠标事件。突然,现在当我安装了这段代码的Visual Studio 2010和.NET Framework 4.0我休息的测试版2:SetWindowsHookEx在beta2 x64上失败

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

哦,我是一个X64机器上运行。任何人都知道解决这个问题?不是一个简单的修复,我知道..

+0

Break = crash or NULL hook or ...? – popester 2009-10-22 20:14:52

+0

您在上面的代码中收到编译器错误?它是什么? – 2009-10-22 20:22:23

+0

本身不是错误,hKeyboardHook设置为0,并且Marshal.GetLastWin32Error();也被设置为0.另一个用户正在获得“错误代码#87(-2147467259)正在传递给Win32Exception,并且它失败并出现”参数不正确“错误。”但好奇地不是我:/ – Homde 2009-10-22 20:27:07

回答

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 
} 

所以这是所有)

0

保留实例参数为0似乎XP需要它,但WIN7犯规。

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