1

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 ウィンドウのコードにアクセスできないので、カスタム メッセージなどを実装することはできません。

4

1 に答える 1

0

これを解決してくれた Hans Passant に感謝します!

クラッシュの問題は、ウィンドウ ハンドルが信頼できないことが原因でした。ウィンドウ ハンドルを変数に格納するのをやめ、代わりに GetParent() を使用してその場で取得しました。

また、現在のウィンドウにフォーカスを設定する必要もありませんでした。SendMessage を PostMessage に置き換えるだけで済みました。したがって、新しいコードは次のとおりです。

case WM_KEYDOWN:
    ...code to handle modifiers like shift, ctrl, etc...
    else
    {
        PostMessage(GetParent(win32Frame->getPlatformWindow ()), message, wParam, lParam);
    }
于 2013-07-07T21:10:23.697 に答える