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
呼び出すたびにコールバックを呼び出すことが保証されていないため、私の JS コールバックは、ウィンドウ メッセージが受信されるたびに呼び出されます。