前回のサンプルは押されているキーをリスト化するのは楽ですが、個々のキーが押されているかをチェックするのに不便でしたので、今回はそれを少し改良したいと思います。
キーボードの「↑↓←→」を押すと、フォーム上のラベルが移動します。

下のリンクから今回のプロジェクトをダウンロードできます。
| ファイル名 | 言語 | サイズ |
|---|---|---|
| keyboardstate_cs_1_1.zip | C# | 19KB |
| keyboardstate_vb_1_1.zip | VB.NET | 25KB |
| keyboardstate_cpp_1_1.zip | C++/CLI | 11KB |
今回のメインコードファイルを載せます。重要なコードを赤色で表示させています。部分的な説明に関してはコードの下の方で説明しています。
using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.DirectInput; namespace MDXSample { /// <summary> /// メインサンプルクラス /// </summary> public class MainSample : IDisposable { /// <summary> /// メインフォーム /// </summary> private MainForm _form = null; /// <summary> /// キーボードデバイス /// </summary> private Device _keyboradDevice = null; /// <summary> /// アプリケーションの初期化 /// </summary> /// <param name="topLevelForm">トップレベルウインドウ</param> /// <returns>全ての初期化がOKなら true, ひとつでも失敗したら false を返すようにする</returns> /// <remarks> /// false を返した場合は、自動的にアプリケーションが終了するようになっている /// </remarks> public bool InitializeApplication(MainForm topLevelForm) { // フォームの参照を保持 this._form = topLevelForm; // キーボードデバイスの初期化 try { // キーボードデバイスの作成 this._keyboradDevice = new Device(SystemGuid.Keyboard); // 協調レベルの設定 this._keyboradDevice.SetCooperativeLevel(topLevelForm, CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.Background); } catch (DirectXException ex) { MessageBox.Show(ex.ToString(), "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } try { // キャプチャするデバイスを取得 this._keyboradDevice.Acquire(); } catch (DirectXException) { } return true; } /// <summary> /// メインループ処理 /// </summary> public void MainLoop() { KeyboardState state = null; try { // 押されたキーをキャプチャ state = this._keyboradDevice.GetCurrentKeyboardState(); } catch (DirectXException) { try { // キャプチャするデバイスを取得 this._keyboradDevice.Acquire(); // 押されたキーをキャプチャ state = this._keyboradDevice.GetCurrentKeyboardState(); } catch (DirectXException) { } } if (state == null) { // デバイスをキャプチャできないとき return; } // 各キーのチェックし、ラベルの移動 if (state[Key.Up]) { this._form.InputLabel.Top--; } if (state[Key.Down]) { this._form.InputLabel.Top++; } if (state[Key.Left]) { this._form.InputLabel.Left--; } if (state[Key.Right]) { this._form.InputLabel.Left++; } } /// <summary> /// リソースの破棄をするために呼ばれる /// </summary> public void Dispose() { // キーボードデバイスの解放 if (this._keyboradDevice != null) { this._keyboradDevice.Dispose(); } } } } |
では、赤文字の部分を説明していきます。
KeyboardState state = null; try { // 押されたキーをキャプチャ state = this._keyboradDevice.GetCurrentKeyboardState(); } catch (DirectXException) { try { // キャプチャするデバイスを取得 this._keyboradDevice.Acquire(); // 押されたキーをキャプチャ state = this._keyboradDevice.GetCurrentKeyboardState(); } catch (DirectXException) { } } |
今回は「KeyboardState」クラスを用意しておきます。「Device.GetCurrentKeyboardState」メソッドで受け取ることにより、全てのキーの押下状態を調べることが出来ます。
if (state == null) { // デバイスをキャプチャできないとき return; } |
もしデバイスの取得に失敗している場合は return で抜けます。
// 各キーのチェックし、ラベルの移動 if (state[Key.Up]) { this._form.InputLabel.Top--; } if (state[Key.Down]) { this._form.InputLabel.Top++; } if (state[Key.Left]) { this._form.InputLabel.Left--; } if (state[Key.Right]) { this._form.InputLabel.Left++; } |
後は個々のキーを調べるだけです。書きかたは上記を参考にしてもらえれば分かると思います。今回はフォームのラベルが移動できるようにしています。