如何在nodejs插件中抽取窗口消息?

jos*_*736 9 c++ winapi v8 node.js libuv

在Windows nodejs插件中,我创建了一个用于接收消息的窗口.

Handle<Value> MakeMessageWindow(const Arguments &args) { // exposed to JS
    ...
    CreateWindow(L"ClassName", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0);
    ...
}
Run Code Online (Sandbox Code Playgroud)

我有一个wndproc函数.

Local<Function> wndProc;
LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    // pack up the arguments into Local<Value> argv
    wndProc->Call(Context::GetCurrent()->Global(), 3, argv);
}
Run Code Online (Sandbox Code Playgroud)

现在我需要抽取消息.通常,你会做类似的事情

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) 
{
     TranslateMessage(&msg);
     DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)

...但这不起作用,因为它只会阻止v8事件循环.

如何以不阻止v8的方式提取Windows消息,并允许我在窗口收到消息时调用JS函数?

我假设libuv将扮演一个角色,但我不确定如何安全地从C运行在一个单独的线程上调用JS函数,特别是因为uv_async_send不保证每次调用它时都会调用一个回调,我需要确保每次收到窗口消息时都会调用我的JS回调.

jos*_*736 11

我的错误是试图在V8线程上创建窗口.相反,uv_thread_create应该用于调用在新线程上创建窗口的函数,然后继续执行自己的消息泵循环.

然后,wndproc函数需要以线程安全的方式将收到的消息保存到队列中,然后用于uv_async_send通知V8线程消息已到达.

uv_async_init然后在消息入队后调用V8线程上的函数(传递给它).该函数(线程安全地)将每个待处理消息从队列中弹出并调用JS回调.

  • 好消息.你偶然有一个repo或节点模块来完成这个吗?我想做同样的事情. (3认同)