個々のキーのチェック

Tarikh penciptaan halaman :

Halaman yang anda sedang memapar tidak menyokong bahasa paparan yang dipilih.

前回のサンプルは押されているキーをリスト化するのは楽ですが、個々のキーが押されているかをチェックするのに不便でしたので、今回はそれを少し改良したいと思います。

キーボードの「↑↓←→」を押すと、フォーム上のラベルが移動します。

個々のキーのチェック

今回のメインコードファイルを載せます。部分的な説明に関してはコードの下の方で説明しています。

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++;
}

後は個々のキーを調べるだけです。書きかたは上記を参考にしてもらえれば分かると思います。今回はフォームのラベルが移動できるようにしています。