アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 );
---------------------------------

A 回答 (2件)

デバイスロストしたときはGetDeviceState( )の前にAcquire( )しないとだめなようです


自分はデバイス獲得済みであろうがとりあえずAcquireしてます
hr2 = lpDIDeviceM->Acquire();
if (hr2 == DI_OK || hr2 == S_FALSE)
{
hr2 = lpDIDeviceM->GetDeviceState( sizeof(DIMOUSESTATE), &dims );
if (hr2 == DI_OK)
{
// 受け取り処理
    • good
    • 0
この回答へのお礼

ありがとうございます・・!
こういう方法で上手くいくのですね。

>>1.フォーカスを別アプリに移して戻すと、一切操作を受付けなくなる。
の問題を無事解決できました。
感謝っ!

お礼日時:2009/04/02 19:54

 こんばんは。


 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();
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます。

このままだと強制終了エラーが出るので、今は取り込む事ができませんでしたが、
ウィンドウのメッセージでの制御の方法もあるのですね。

別の問題が発生した時にこちらの方法を色々調べて行きたいと思います。
ありがとうございましたっ

お礼日時:2009/04/02 20:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!