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

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

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

我有一个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); } 

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

 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 

…但这不会工作,因为它只会阻止v8事件循环。

如何以不会阻塞v8的方式泵送Windows消息,并允许我在窗口接收消息时调用JS函数?

我认为libuv会发挥作用,但我不确定如何安全地从一个单独的线程上运行C调用一个JS函数,特别是因为uv_async_send不保证每次调用时都调用一个callback函数, 所以我需要确保每次收到窗口消息时,都会调用我的JScallback函数。

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

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

消息排队后,V8线程(传递给uv_async_init )的函数将被调用。 函数(线程安全)从队列中popup每个挂起的消息并调用JScallback。