- ベストアンサー
ダイアログボックスを利用したキーコンフィグ
現在、DirectInputを利用してジョイパッドのキーコンフィグ機能を作成しているのですが問題が発生したので質問させていただきます。 今の状況としてはジョイパッドの認識は出来ているのですがキー入力が一度、ダイアログボックスをマウスでクリック、または移動した直後でないと反映されないというものです。 ここでの反映とはダイアログボックスが更新されないというものではなくキー入力自体が反映されないということです。 自分でもよく考えたのですがお手上げ状態です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。補足いただきました。 >>現在はボタンが押されたときしか処理していないようでした、そこで思ったのですが常に処理をするようにするようなメッセージはあるのでしょうか? //ジョイスティックの状態取得 DIJOYSTATE js; pJoystick->Poll(); HRESULT ret = pJoystick->GetDeviceState(sizeof(js), &js); 上記の呼び出しを繰り返す事でジョイスティックからボタンや十時キーの状態がリアルタイムに取れる筈です。どこかで一回呼び出しただけでは不十分です。 ウィンドウメッセージと関係なく、常に上記の呼び出しを繰り返さなくては成らない筈です。 常に処理をするには「アイドリングループ」若しくは「マルチスレッド」を使用します。 「アイドリングループ」の方が手っ取り早くて簡単です。「マルチスレッド」は便利ですが、スレッド間でデータを共有する場合「クリティカルセクション」等が必要です。 以下は「アイドリングループ」の方です。 int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int iCmdWnd) { MSG msg; HWND hDlg = ダイアログを開く; ::ShowWindow(hDlg, iCmdWnd); while(TRUE) { if(::PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)) { if(!::GetMessage(&msg, NULL, 0, 0)) break; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } else { //アイドリングです。ここで処理し続けます。何回も呼ばれ続けます。 //ジョイスティックのポインタを確認 if(pJoystick) { //ジョイスティックの状態取得 DIJOYSTATE js; pJoystick->Poll(); HRESULT ret = pJoystick->GetDeviceState(sizeof(js), &js); //js変数にジョイスティックの現在の状態が入っている } } } return msg.wParam; } 余談ですが、ダイアログプロシージャの中に以下のメッセージ処理も、有った方が良いかもしれません。 case WM_ACTIVATE: { if(pJoystick) { const int fActive = LOWORD(wParam); if(fActive == WA_INACTIVE) pJoystick->Unaquire(); else pJoystick->Aquire(); } break; }
その他の回答 (1)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 >>今の状況としてはジョイパッドの認識は出来ているのですがキー入力が一度、ダイアログボックスをマウスでクリック、または移動した直後でないと反映されないというものです。 >>ここでの反映とはダイアログボックスが更新されないというものではなくキー入力自体が反映されないということです。 ジョイスティックは作った事無いのですが(キーボード・マウスは良く作る)、状況から推測すると、「WM_LBUTTONDOWN」や「WM_MOUSEMOVE」辺りで「IDirectInputDevice::Aquire()」メソッドを呼び出ししているのでは? 「WM_ACTIVATE」や「WM_INITDIALOG」辺りで 「IDirectInputDevice::Aquire()」メソッドを呼び出しているかどうかを確認してみてください。
補足
回答ありがとうございます。 説明が不足していたようですので申し訳ありません。 ダイアログボックスのプロシージャでは「WM_INITDIALOG」、「WM_COMMAND」の2つのメッセージのみしか処理していませんのでマウスのクリックなどのメッセージは処理していません。 あと、生成しているのはダイアログボックスのみでした。 現在はボタンが押されたときしか処理していないようでした、そこで思ったのですが常に処理をするようにするようなメッセージはあるのでしょうか? 重ねて質問をして申し訳ありません。
お礼
回答ありがとうございます。 なるほど・・・「アイドリングループ」で組みなおしてみるとうまくいきました。 貴重な回答をありがとうございます。