2011-03-13 40 views
0
#include <stdio.h> 
#include <windows.h> 

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
printf("Keyboard event, nCode = %d, wParam = %d, lParam = 0x%.8X\n", nCode, wParam, lParam); 
return (LRESULT)NULL; 
} 

void main() { 
HHOOK HookHandle = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, (HINSTANCE) NULL, GetCurrentThreadId()); 
printf("Hook handle = 0x%.8X\n", HookHandle); 

MSG message; 
while (GetMessage(&message,NULL,0,0)) { 
TranslateMessage(&message); 
DispatchMessage(&message); 
} 

UnhookWindowsHookEx(HookHandle); 
} 

預計輸出類似「鍵盤事件...」,但它不起作用,無論我輸入什麼,它總是保持沉默。爲什麼SetWindowsHookEx不能在CLI中使用(在main()中代碼而不是dllmain等)?

的編譯選項很簡單:gcc的-o test.exe的test.c的

回答

1

大部分(如果不是全部),這些鉤子都被注入到目標應用程序(S),所以他們必須在執行一個DLL。

+0

因此,無法在沒有DLL的控制檯程序中捕獲鍵盤事件? – Chen 2011-03-13 17:18:59

+1

「捕獲」不是很具體。你可以設置一個WH_KEYBOARD_LL鉤子,它不需要DLL。 – 2011-03-13 19:18:05

+0

WH_KEYBOARD_LL是一個全局鉤子,我認爲它必須在DLL中,因爲這個鏈接說:[link](http://www.codeguru.com/cpp/wp/system/keyboard/article.php/c5699) – Chen 2011-03-14 10:27:24

0

KeyboardProc回調函數的文檔:

的系統調用此函數 每當應用程序調用 的GetMessage或的PeekMessage功能和 有鍵盤消息(WM_KEYUP 或WM_KEYDOWN)是處理。

控制檯應用程序不使用消息隊列來處理輸入,因此您的掛鉤永遠不會被調用。

您可以嘗試使用低級別鍵盤掛鉤(WH_KEYBOARD_LL)。儘管這是全局鉤子,但不需要使用DLL:如documentation的備註部分所述,鉤子代碼不會在其他進程中注入。這種方法的問題當然是你會得到系統中所有關鍵事件的通知(不只是你程序中的那些事件)。

+0

hm ..似乎我不能在回覆中發佈換行符文本。我想發佈一些可以通過registerhotkey()獲取getmessage()的代碼。我認爲這意味着消息隊列應該在控制檯應用程序中運行 – Chen 2011-03-13 17:23:06

+0

@Chen,消息隊列在控制檯應用中工作得很好。 RegisterHotKey()會導致WM_HOTKEY被髮送,你可以照常在msg循環中處理它。問題是*控制檯鍵盤輸入*不會生成任何WM_KEYUP/DOWN消息,因此它不能被WH_KEYBOARD捕獲。 – efotinis 2011-03-14 15:07:01

+0

我將WH_KEYBOARD改爲WH_KEYBOARD_LL。但仍然不起作用。我想要獲得系統中的所有關鍵事件。 – Chen 2011-03-14 19:44:35

相關問題