VSTGUI 4.0 を使用して VST を実装しようとしています。私の DAW は WM_KEYDOWN および WM_KEYUP メッセージを使用して、キーボードの押下に基づいて MIDI ノートを送信し、キーボードで VST を再生できるようにします。問題は、WM_LBUTTONDOWN メッセージを受信したときに VSTGUI がこれを行うことです。
win32Frame->prevFocus = SetFocus (win32Frame->getPlatformWindow ());
CPoint where ((CCoord)((int)(short)LOWORD(lParam)), (CCoord)((int)(short)HIWORD(lParam)));
if (pFrame->platformOnMouseDown (where, buttons) == kMouseEventHandled)
SetCapture (win32Frame->getPlatformWindow ());
return 0;
これにより、DAW からフォーカスが奪われ、キーの押下を処理できなくなります。VSTGUI は、コントロールを微調整するために WM_MOUSEWHEEL および WM_KEYUP/WM_KEYDOWN イベントを処理するために、ウィンドウ フォーカスを必要とします。しかし、VST でコントロールを微調整しているときは、キーボードでノートを演奏してどのように聞こえるかを確認したいので、両方の機能が重要です。
この問題を解決する唯一の方法は、親ウィンドウに SetFocus() を送信し、SendMessage() を使用して WM_KEYUP/WM_KEYDOWN メッセージを送信し、次に SetFocus() を VST ウィンドウに戻すことでした。
case WM_KEYDOWN:
...code to handle modifiers like shift, ctrl, etc...
else
{
SetFocus(win32Frame->prevFocus);
SendMessage(win32Frame->prevFocus, message, wParam, lParam);
SetFocus(win32Frame->getPlatformWindow ());
}
これは完全に機能しますが、VST をクリックしてキーを同時に押すと、未定義のことが発生します (DAW のフリーズ、DAW のクラッシュ、スタック オーバーフローなど)。
したがって、明らかに私はこれに対して間違ったアプローチを取っています。VST などにフォーカスを戻す前に、PostMessage() を実行してコールバックを待つ必要があるように感じます。それはちょっとめちゃくちゃに聞こえますが、このような問題に対処する正しい方法は何ですか?
メッセージを渡す DAW ウィンドウのコードにアクセスできないので、カスタム メッセージなどを実装することはできません。