gpt4 book ai didi

C++ 控制台应用程序,SetWindowsHookEx,永远不会调用回调

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:46 26 4
gpt4 key购买 nike

我有一个带有嵌入式 v8 引擎的小型控制台应用程序,我想添加一个 Hook 来注册按键事件。这一切在我使用 Qt 和 QtScript 之前都有效,但我将它全部移植到 VC++ 2008 中的直接 C++。应用程序编译并运行,但从未调用 Hook ,这是相关代码:

在主函数中

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

这本质上是 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 中所有绑定(bind)的 c++ 方法等,所以这件事让我很生气。

任何帮助,也许是一些教育 Material 的指针,我们将不胜感激。

需要说明的是,c: LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) 中的这个函数永远不会被调用,或者永远不会看到 printf,并且开始时的输出显示:Hook established, so windows正在报告 Hook 已建立。

/贾森

最佳答案

低级钩子(Hook),如 WH_KEYBOARD_LL 要求您的应用程序抽取消息循环。这是 Windows 可以进入您的线程并调用您注册的 HookProc 回调的唯一方法。

控制台模式应用程序不会像常规 Windows GUI 应用程序那样发送消息循环。从您的代码片段来看,添加一个也不容易。您需要创建一个线程。

关于C++ 控制台应用程序,SetWindowsHookEx,永远不会调用回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6974702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com