0

DirectInputよりもWindowsメッセージを使用する方が望ましいとどこでも読んだことがあります。それにもかかわらず、多くの DirectInput チュートリアルがあり、Windows メッセージングでキーボードを扱うためのチュートリアルはほとんどありません。良い情報源が見つからなかったので、自分で試してみました.

キーが押された場合に保持する 2 つの 256 メンバ bool 配列を作成しました。このフレームでキーが押されたかどうかを m_bKeyDown[256] で確認し、このフレームでキーが押されていないかどうかを m_bKeyDown で確認できるようにしたいと考えています。私の MsgProc switch ステートメントは次のとおりです。

LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
case WM_KEYDOWN:
    if(m_bKeyPressed[wParam])
        m_bKeyDown[wParam] = false;
    else
        m_bKeyDown[wParam] = true;
    break;
    m_bKeyPressed[wParam] = true;
case WM_KEYUP:
    m_bKeyDown[wParam] = false;
    m_bKeyPressed[wParam] = false;
    break;
}

return DefWindowProc(hwnd, msg, wParam, lParam);

}

F1キーを押し続けると音が出るようにテストしてみました。理想的には、ボタンを離してもう一度押すまで、サウンドが繰り返されないようにする必要があります。

    if(m_bKeyDown[VK_F1])
    m_fMod.FPlaySound(testSound);

違いはないようですが、ボタンを押し続けると音が繰り返されます。これを行うには、ループを修正するか、Windows メッセージングをセットアップする方法を教えてください。私は正しい道を進んでいますか、それともまったく別の方向に進むべきですか?

編集: iedoc の以下の例を使用したところ、改善されましたが、何らかの理由で遅延があるように、サウンドは停止する前に 3 回再生されます。これを回避する方法はありますか?

4

1 に答える 1