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をブロックしないようにし、Windowsのメッセージポンプと私の窓がメッセージを受信したとき、私はJS関数を呼び出すことができますか?
私はlibuvが役割を果たしていると推測しますが、別のスレッドで実行されているCのJS関数を安全に呼び出す方法がわからない、特にuv_async_send
is not guaranteed to invoke a callback every time you call it以降です.JSコールバックが毎回呼び出されるようにする必要があります。ウィンドウメッセージが受信される。
グレート情報。あなたは、これを実現するレポやノードモジュールを偶然に持っていますか?私は同じことをするために探しています。 – Charlie
あなたのアプローチは機能しましたか?コールバック関数をuv_async_sendに渡すのに問題があります。関数uv_thread_createが呼び出されると、コールバック関数を保持できません。でも、永続的なハンドルが出て働いていない - 私はSO too.httpにその質問を掲載しました://stackoverflow.com/questions/31159029/how-to-use-persistent-handles-for-callback-functions-in-v8 – opensourcegeek
このテクニックを使用するコードレポを持っているか知っていますか?これはまさに私が取っているアプローチです。 – Niall