- ベストアンサー
DirectInputが上手く動きません;
DirectInputを使って操作は正しく取得できるようになったのですが、 つぎはぎで最低限動く所にこぎつけただけで 色々問題が有ります・・orz 1.フォーカスを別アプリに移して戻すと、一切操作を受付けなくなる。 2.Unacquire(); を入れなければならないらしいけれど、入れるべき場所が解らない 3.動かしてみる度に、マウス座標の受け取りが劣悪な程遅くなってくる。。 コードは大よそ以下のようになっています。 どこか怪しい部分がわかる方が推察できる方がいらっしゃいましたら ご指摘願います、その部分のコード全体を書き出そうと思います。 よろしくお願い致します。 orz --------------------------------- //●Inputクラス 初期化用関数内 DirectInput8Create(); //オブジェクト作成 lpDI lpDI->CreateDevice(); //マウス用作成 lpDIDeviceM lpDIDeviceM->SetDataFormat(); lpDIDeviceM->SetCooperativeLevel() lpDIDeviceM->Acquire(); lpDI->CreateDevice(); //キーボード用作成 lpDIDeviceK lpDIDeviceK->SetDataFormat(); lpDIDeviceK->SetCooperativeLevel() lpDIDeviceK->Acquire(); //●Inputクラス マウス用状態取得関数内(キーボードも同じ構造です) DIMOUSESTATE dims; HRESULT hr2; hr2 = lpDIDeviceM->GetDeviceState( sizeof(DIMOUSESTATE), &dims ); if (hr2==DIERR_INPUTLOST) { g_lpDIDeviceM->Acquire(); } else if (SUCCEEDED(hr2)) { // 受け取り処理 } //●Inputクラス デストラクタ処理 //Unacquire();をすべき場所はここなのでしょうか SAFE_RELEASE( lpDIDeviceK ); SAFE_RELEASE( lpDIDeviceM ); SAFE_RELEASE( lpDI ); ---------------------------------
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
デバイスロストしたときはGetDeviceState( )の前にAcquire( )しないとだめなようです 自分はデバイス獲得済みであろうがとりあえずAcquireしてます hr2 = lpDIDeviceM->Acquire(); if (hr2 == DI_OK || hr2 == S_FALSE) { hr2 = lpDIDeviceM->GetDeviceState( sizeof(DIMOUSESTATE), &dims ); if (hr2 == DI_OK) { // 受け取り処理
その他の回答 (1)
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 WM_ACTIVATEを適切に処理して、入力デバイスの所有権を切り替えないといけない筈です。 case WM_ACTIVATE: { const BOOL fActive = LOWORD(wParam); const BOOL fMinimized = (BOOL) HIWORD(wParam); HWND hwndPrevious = (HWND)lParam; //ウィンドウが非アクティブに成った時 if(fActive == WA_INACTIVE) { g_lpDIDeviceM->Unacquire(); g_lpDIDeviceK->Unacquire(); } else { g_lpDIDeviceM->Acquire(); g_lpDIDeviceK->Acquire(); } }
お礼
ありがとうございます。 このままだと強制終了エラーが出るので、今は取り込む事ができませんでしたが、 ウィンドウのメッセージでの制御の方法もあるのですね。 別の問題が発生した時にこちらの方法を色々調べて行きたいと思います。 ありがとうございましたっ
お礼
ありがとうございます・・! こういう方法で上手くいくのですね。 >>1.フォーカスを別アプリに移して戻すと、一切操作を受付けなくなる。 の問題を無事解決できました。 感謝っ!