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 回再生されます。これを回避する方法はありますか?