2009-10-22 76 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);