2010-01-30 3 views
5

키 위쪽 (예 : 위쪽 화살표)을 녹음하고 싶은 콘솔 응용 프로그램을 만들고 있습니다. 모든 스레드에서 모든 키 누르기를 캡처하고 콜백 함수를 호출해야하는 로우 레벨 키보드 후크를 만들었지 만 작동하지 않습니다. 이 프로그램은 키를 눌렀을 때 약간 멈추지 만 결코 콜백을 호출하지 않습니다. 나는 문서를 확인했지만 아무것도 발견하지 못했습니다. SetWindowsHookEx()를 잘못 사용하고 있는지 (내 지식에 따라 후크가 성공적으로 만들어 짐) 콜백 함수가 올바르지 않습니다. 나는 틀린 것이 확실하지 않다! 도움에 미리 감사드립니다. 당신은 콜합니다 (getchar가)에 차단할 수C++ SetWindowsHookEx WH_KEYBOARD_LL 수정 설정

#include "Windows.h" 
#include <iostream> 
using namespace std; 

HHOOK hookHandle; 

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam); 

int _tmain(int argc, _TCHAR* argv[]) { 

hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0); 

if(hookHandle == NULL) { 
    cout << "ERROR CREATING HOOK: "; 
    cout << GetLastError() << endl; 
    getchar(); 
    return 0; 
} 

MSG message; 

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

cout << "Press any key to quit..."; 
getchar(); 

UnhookWindowsHookEx(hookHandle); 

return 0; 
} 


LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) { 
cout << "Hello!" << endl; 

// Checks whether params contain action about keystroke 
if(nCode == HC_ACTION) { 
    cout << ((KBDLLHOOKSTRUCT *) lParam)->vkCode << endl; 
} 

return CallNextHookEx(hookHandle, nCode, 
      wParam, lParam); 
} 
+0

([여기]를 참조하시기 바랍니다 http://stackoverflow.com/questions/2127112/global-keyboard-hook-not-working/2127292 # 2127292) 나는 당신에게 도움이 될 답변을했던 비슷한 질문을했습니다. – t0mm13b

답변

2

, 당신은 창 루프를 실행하고 후크가 호출되기 전에 메시지를 처리해야합니다.

+0

윈도우 루프는 어떻게 구현합니까? 나는 WinAPI에 익숙하지 않다. (실제로 윈도우 루프의 목적은 무엇인가?) – Mahir

+0

http://msdn.microsoft.com/en-us/library/aa383682(VS.85).aspx는 좋은 예이다. –

+0

고마워. 나는 여전히 문제가 있다면 몇 분 후에 다시 게시 할 것입니다. – Mahir

0

Windows XP에서는 SetWindowsHookEx의 세 번째 인수로 hInstance (WinMain)을 전달해야합니다. 예 :

int WINAPI WinMain 
(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPTSTR lpCmdLine, int nCmdShow) { 

    hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, hInstance, 0); 

// ... 
0

나는 simle을 먼저 제안합니다.

// VB : 응용 프로그램 인스턴스 검색 HINSTANCE appInstance = GetModuleHandle (NULL);

다음 : hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, appInstance, 0);

// ...하지만 또 다른 오류도 나중에있다