2012-05-15 193 views
1

我面臨的問題是,我無法獲得由SetWindowsHookEx返回的有效的hookID,而且GetLastWin32Error()也返回0。我寫了下面的代碼:SetWindowsHookEx返回0,GetLastWin32Error()也返回0

_LowLevelhookID = SetWindowsHookEx((int)HookType.WH_KEYBOARD_LL, LowLevelKeyboardHookHandler, IntPtr.Zero, GetCurrentThreadId()); 

int errorCode = -1; 

if(_LowLevelhookID == (IntPtr)0) 
{ 
    errorCode = Marshal.GetLastWin32Error(); 
} 

其實我想創建一個低級別的鍵盤鉤子對我的應用程序只根據SetWindowsHookEx函數參數說明我應設置HMOD參數爲空,如果我想設置當前線程ID和僅捕獲我的應用程序的關鍵事件。

任何人都可以確認GetCurrentThreadId()是否需要運行我的應用程序的ThreadID的正確方法?

回答

1

WH_KEYBOARD_LL掛鉤是全球性的,您無法將其安裝在您的應用程序中。

Marshal.GetLastWin32Error()可能無法正常工作,因爲您沒有爲SetWindowsHookEx添加SetLastError = trueDllImportAttribute

+0

實際上,我確實設置了SetLastError,我在第一步中錯過了它,但後來糾正了它。好的,所以一般來說WH_KEYBOARD_LL不能用來覆蓋我的應用的關鍵信息嗎? – inva

+0

那麼,你可以隨時在鉤子過程中手動過濾鍵盤事件,檢查你的應用程序是否處於活動狀態。另請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx的'Remarks'部分 - 它定義了鉤子作用域。 – max