gpt4 book ai didi

c++ - 如何在 nodejs 插件中泵送窗口消息?

转载 作者:IT老高 更新时间:2023-10-28 23:25:01 30 4
gpt4 key购买 nike

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

我有一个 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 并允许我在窗口接收到消息时调用 JS 函数的方式发送 Windows 消息?

我认为 libuv 会起作用,但我不确定如何从运行在单独线程上的 C 安全地调用 JS 函数,尤其是在 uv_async_send is not guaranteed to invoke a callback every time you call it 之后,并且我需要确保每次收到窗口消息时都会调用我的JS回调。

最佳答案

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

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

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

关于c++ - 如何在 nodejs 插件中泵送窗口消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17737018/

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