個々のキーのチェック
Ημερομηνία δημιουργίας σελίδας :
Η σελίδα που προβάλετε αυτήν τη στιγμή δεν υποστηρίζει την επιλεγμένη γλώσσα εμφάνισης.
前回のサンプルは押されているキーをリスト化するのは楽ですが、個々のキーが押されているかをチェックするのに不便でしたので、今回はそれを少し改良したいと思います。
キーボードの「↑↓←→」を押すと、フォーム上のラベルが移動します。
今回のメインコードファイルを載せます。部分的な説明に関してはコードの下の方で説明しています。
MainSample.cs
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++;
}
後は個々のキーを調べるだけです。書きかたは上記を参考にしてもらえれば分かると思います。今回はフォームのラベルが移動できるようにしています。