У меня есть небольшое консольное приложение со встроенным ядром 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