2011-08-07 3 views
4

v8 엔진이 내장 된 콘솔 애플리케이션이 있습니다. 키 이벤트를 등록하기 위해 후크를 추가하고 싶습니다. 이것은 Qt와 QtScript를 사용하기 전에는 모두 작동했지만 VC++ 2008에서는 똑바로 C++로 포팅했습니다. 응용 프로그램이 컴파일되고 실행되지만 후크는 호출되지 않습니다. 관련 코드는 다음과 같습니다.C++ 콘솔 앱, SetWindowsHookEx, Callback이 절대 호출되지 않습니다

주()

HWND hwndC = GetConsoleWindow() ; 
    HINSTANCE hInst = (HINSTANCE)GetWindowLong(hwndC, GWL_HINSTANCE); 
    if (SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, hInst, NULL) == 0) { 
     printf("Failed to set hook\n"); 
    } else { 
     printf("Hook established\n"); 
    } 
    g->RunScript(argc,argv); 

그리고 PROC :

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    printf("HookProc called\n"); 
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam); 
    if (wParam == WM_KEYDOWN) { 
     keyDown(p,g); 
    } else if (wParam == WM_KEYUP) { 
     keyUp(p,g); 
    } 
    fflush(stdout); 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

이것은 V8의 샘플 코드에 shell.cc 팽창 본질적이다. 어떻게 든 차단하는지 궁금하네요? 나는 여기서 뭘하고 있는지 알지 못한다는 것을 인정한다. 놀고 배우기는하지만이 하나가 나를 곤란하게 만든다. 를 keyDown의 내부

내가 이런 걸 가지고 말 :

v8::Handle<v8::String> callback_name = v8::String::New("onKeyDown"); 
    v8::Handle<v8::Value> callback_val = g->_context->Global()->Get(callback_name); 
    if (!callback_val->IsFunction()) { 
     printf("No onKeyDown handler found\n"); 
     return; 
    } 
    v8::Handle<v8::Function> callback = v8::Handle<v8::Function>::Cast(callback_val); 
    const int argc = 1; 
    v8::Handle<v8::Value> argv[argc] = { v8::Int32::New(char(p->vkCode)) }; 
    printf("Calling onKeyDown\n"); 
    v8::Handle<v8::Value> result = callback->Call(g->_context->Global(), argc, argv); 

이 중 일부는 실제로 결국 작동하지 않을 수 있습니다,하지만 난이 프로그램을 실행할 때 그것은 단지라는 결코 극복하고, 정의 onKeyDown에 = function (key) {...}; 나는 onKeyDown이 잘 작동하는 것을 볼 수 있습니다. JS에서 바인딩 된 C++ 메소드를 모두 사용할 수 있습니다. 그래서이 것은 단지 나를 박쥐로 몰아 넣습니다.

어떤 도움이 될지 모르지만 일부 교육 자료에 대한 안내는 많은 도움이 될 것입니다.

이 함수는 c : LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam) 함수가 호출되지 않았거나 printf를 보지 못했다는 것을 의미합니다. windows가 후크가 설립되었음을보고합니다.

/제이슨

답변

7

낮은 수준의 후크, WH_KEYBOARD_LL 같은 응용 프로그램이 메시지 루프를 펌프해야합니다. 이것이 Windows가 스레드에 침입하여 등록한 HookProc 콜백을 호출 할 수있는 유일한 방법입니다.

일반 Windows GUI 응용 프로그램처럼 콘솔 모드 앱이 메시지 루프를 펌프하지 않습니다. 귀하의 발췌 문장에서 판단 해 보시면 하나를 추가하는 것이 쉽지 않을 것입니다. 스레드를 만들어야합니다.

+0

그것이 내가 두려워했던 것입니다. 나는 그렇게 생각하지 않았습니다. 그러면 또 다른 질문이 생깁니다. 독서의 관점에서 무엇을 권하고 싶습니까? 응용 프로그램이 개발되면서 적어도 1 개의 추가 스레드가 실행되어야한다는 것을 알고 있습니다. 도움이 될만한 온라인으로 좋은 기사를 가리킬 수 있다면 정말 좋을 것입니다. –

0

이 기능이 도움이 될 수 있습니까? GetAsyncKeyState

+0

모든 키가 필요합니다. 대화 형 쉘 측면 때문에 스레드를 필요로합니다. –

관련 문제