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 );
---------------------------------
No.1ベストアンサー
- 回答日時:
デバイスロストしたときはGetDeviceState( )の前にAcquire( )しないとだめなようです
自分はデバイス獲得済みであろうがとりあえずAcquireしてます
hr2 = lpDIDeviceM->Acquire();
if (hr2 == DI_OK || hr2 == S_FALSE)
{
hr2 = lpDIDeviceM->GetDeviceState( sizeof(DIMOUSESTATE), &dims );
if (hr2 == DI_OK)
{
// 受け取り処理
ありがとうございます・・!
こういう方法で上手くいくのですね。
>>1.フォーカスを別アプリに移して戻すと、一切操作を受付けなくなる。
の問題を無事解決できました。
感謝っ!
No.2
- 回答日時:
こんばんは。
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();
}
}
ありがとうございます。
このままだと強制終了エラーが出るので、今は取り込む事ができませんでしたが、
ウィンドウのメッセージでの制御の方法もあるのですね。
別の問題が発生した時にこちらの方法を色々調べて行きたいと思います。
ありがとうございましたっ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- その他(パソコン・周辺機器) 2つのPCを行き来する 2 2022/06/15 01:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LV_ITEM構造体のメンバlParamに...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
インターフェースとトレイトっ...
-
Java初級 引数に適用できません
-
複数の変数を宣言する時、同時...
-
C#でフォームのオブジェクト名...
-
private static という変数の修飾
-
tryの終了
-
javascriptからjavaを呼び出したい
-
java eclipse 型に解決できません
-
Excelで =EMBED("Acrobat Docu...
-
生成したインスタンスを削除す...
-
Vba ListViewの行挿入に関して...
-
Labelコントロールに数字を代入...
-
【sendkeysメソッドが動かずに...
-
final修飾子を使っているのに、...
-
VB.NET getとsetの概念がわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MFCで水平スクロールバー
-
文字列格納について・・・
-
LV_ITEM構造体のメンバlParamに...
-
Varianntメモリリークについて
-
4バイト整数を使っているため
-
DataGridで特定の行のスタイル...
-
セットアップ先のPCでエラー
-
現在VC++2008にて開発を行って...
-
MFC VC++6.0 DestroyWindowの実...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
レコード件数の表示
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
Java初級 引数に適用できません
-
VB.NET getとsetの概念がわかり...
-
0 == False はいいけど
-
パワーポイントのVBAでテキスト...
おすすめ情報