如何在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。
- V8中的Javascript等价物?
- 为Node.js编译本地C ++模块,链接到openSSL / libcrypto失败
- 如何在express node.js POST请求中接收JSON?
- VS2012 node.js模块:排除LNK2005 / LNK1169错误
- 从C ++ Node.js插件渲染文件
- 如何与来自Node.js进程的C ++程序inputstream进行交互?
- 在Asp.Net MVC应用程序的VirtualDirectory中使用IISNode在IIS内托pipeSocket.IO + ExpressJS应用程序
- 我如何将一个更快的语言与Express.js后端集成?
- 将现有的Node Js项目添加到现有的.Net解决scheme中