Консольное приложение C ++, SetWindowsHookEx, Callback никогда не вызывается - PullRequest
4 голосов
/ 07 августа 2011

У меня есть небольшое консольное приложение со встроенным ядром v8, и я хотел бы добавить хук для регистрации ключевых событий. Все это работало раньше, когда я использовал Qt и QtScript, но я перенес все это на прямой C ++ в VC ++ 2008. Приложение компилируется и запускается, но ловушка не вызывается, вот соответствующий код:

В основном ()

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);

И проц:

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);
}

По сути, это расширение shell.cc из примера кода v8. Интересно, это как-то блокирует? Я признаю, что на самом деле не знаю, что я здесь делаю, просто играю и учусь, но это меня озадачило.

Внутри 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 работает просто отлично, я могу использовать весь свой связанный c ++ метод и т. Д. Из JS, так что эта штука просто сводит меня с ума.

Любая помощь, может быть, ссылки на некоторые учебные материалы будет высоко ценится.

Просто чтобы прояснить, эта функция в c: LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam) никогда не вызывается или никогда не видит printf, и вывод при запуске говорит: Хук установлен, поэтому окна сообщает, что хук установлен.

/ Jason

Ответы [ 2 ]

7 голосов
/ 07 августа 2011

Низкоуровневый хук, такой как WH_KEYBOARD_LL, требует, чтобы ваше приложение накачало цикл сообщений.Это единственный способ, которым Windows может проникнуть в ваш поток и сделать вызов зарегистрированному обратному вызову HookProc.

Приложение в режиме консоли не качает цикл сообщений, как обычные приложения с графическим интерфейсом Windows.Судя по вашему фрагменту, добавить его будет нелегко.Вам нужно создать тему.

0 голосов
/ 07 августа 2011

Может быть, эта функция вам поможет? GetAsyncKeyState

...