DirectInputたぶん完全解説・メソッド・・・開始

コードの内部へ・・・

 コードの内部に入るにあたり、書かなければならないコードに関して説明いたします。必要なメソッドは以下の通りです。
・アプリケーション起動時のデバイス及び周辺環境の設定とデバイスのアクセス権取得
・アクセス権取得、環境設定失敗時及び終了時のリセットとリソースの解除
・アプリケーション切り替え時のアクセス権再取得
・コード中枢(値の取得)
・タイマー(データ更新)
 どれも易しくは無いですが、理解すると簡単です。もっとも理解が難しいのがコード中枢で、おわかりでしょうが最も簡単ながら何よりも重要なのが「アクセス権取得、環境設定失敗時及び終了時のリセットとリソースの解除」です。今回、リセット関係のメソッドがFreeDirectInput何が押されたかのboolをWhatkeypushとしてあります。メソッドの説明順序は書きました通りに行っていきます。

アプリケーション起動時のデバイス及び周辺環境の設定とデバイスのアクセス権取得

 ここが、入り口です。ここで、エラーの洗い出しをしてしまいます。実際、使用する場合アプリケーション起動時に行う動作となります。ちなみに、ここで洗い出してしまうので後は省略w

   if(null !=applicationDevice)         //If デバイスが初期値ではない
   {
    FreeDirectInput();           //デバイス解除占用終了メソッド呼び出し
    return;              //If end中止戻る
   }

↑まぁ、スッカラカンにしたばかりなので、ここで躓くことはないとおもいますが、デバイスがスッカラカンかどうか確認して、もしもスッカラカンになっていなかったらここで、解除用メソッドを呼び出し、初期値に戻します。

   timer1.Enabled = false;           //タイマー無効
   FreeDirectInput();
   CooperativeLevelFlags coopFlags;        //占用関連設定

 タイマーを無効にしてDirectInputが本格的に動き出すのを防止します。そして、一応再度デバイスを洗い初期値に戻します。その後占用関連設定の変数をセットします。

   try
   {
    applicationDevice = new Device(SystemGuid.Keyboard);  //デバイスをキーボードに設定
   }
   catch(InputException)           //If例外発生
   {
    FreeDirectInput();
    MessageBox.Show("キーボード占用失敗");      //メッセージボックス
    return;              //If end戻る
   }

 デバイスをキーボードに設定します。もしも、設定できなかった場合メッセージボックスを出すようになっています。InputExceptionとはDirectInputの基底例外タイプです。

   try
   {
//占用関連設定 バックグラウンドによる完全占用はセキリュティ上不可
    coopFlags = CooperativeLevelFlags.NonExclusive;    //このアプリ動作時他アプリデバイス使用可
    coopFlags |= CooperativeLevelFlags.Foreground;    //このアプリが最前面時のみ有効
    applicationDevice.SetCooperativeLevel(this, coopFlags);
   }
   catch(InputException dx)          //If例外発生
   {
//↓不可警告、占用関連設定に問題あり
    if (dx is UnsupportedException)
    {
     FreeDirectInput();
     MessageBox.Show("キーボードを占用できませんでした");
     return;             //If end戻る
    }
   }

 前に出しました、占用関連設定を行うべくcoopFlagsに値を放り込みます。項目は2種類5項目以下の通りです。

CooperativeLevelFlags.Background

バックグラウンド動作アプリケーションが非アクティブでも値の所得が可能

CooperativeLevelFlags.Foreground

最前面(アクティブ時)限定で値の取得が可能

CooperativeLevelFlags.Exclusive

他のアプリケーションにデバイスへのアクセス権が無くなります。

CooperativeLevelFlags.NonExclusive

他のアプリケーションもデバイスへアクセス可能です。

CooperativeLevelFlags.NoWindowsKey

キー無効化

   applicationDevice.Acquire();         //例外排除及び設定完了アクセス権取得・・・占用
   timer1.Enabled = true;           //タイマー有効

 例外やエラー発生の可能性を排除したので、アクセス権を取得、タイマーを有効にします。


 お疲れ様でした、おそらく一番長い開始のメソッドが完了です。