[C#] コンソールでのキー入力の取得方法

C#でコンソールアプリケーションにおいてキー入力を取得するには、Console.ReadKeyメソッドを使用します。

このメソッドは、ユーザーがキーを押すまでプログラムの実行を一時停止し、押されたキーの情報をConsoleKeyInfoオブジェクトとして返します。

Console.ReadKeyには引数としてtrueまたはfalseを指定でき、trueを指定すると押されたキーがコンソールに表示されません。

これにより、ユーザーの入力を非表示にしたい場合に便利です。

ConsoleKeyInfoオブジェクトからは、押されたキーの文字やキーコードを取得することができます。

この記事でわかること
  • C#でのキー入力の基本的な取得方法
  • ConsoleKeyInfoオブジェクトの詳細な使い方
  • キー入力を用いた簡易メニューの実装
  • ゲームやテキストエディタの基本機能
  • 特殊キーや複数キーの処理方法

目次から探す

コンソールアプリケーションでの基本的なキー入力

Console.ReadKeyメソッドの概要

Console.ReadKeyメソッドは、コンソールアプリケーションでユーザーからのキー入力を取得するためのメソッドです。

このメソッドは、ユーザーがキーを押すまでプログラムの実行を一時停止し、押されたキーに関する情報を含むConsoleKeyInfoオブジェクトを返します。

これにより、特定のキーが押されたかどうかを判断することができます。

サンプルコードは以下の通りです。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("任意のキーを押してください...");
        // キー入力を待機
        ConsoleKeyInfo keyInfo = Console.ReadKey(); 
        
        // 押されたキーを表示
        Console.WriteLine($"\n押されたキー: {keyInfo.KeyChar}");
    }
}
任意のキーを押してください...
押されたキー: A  // 例としてAキーを押した場合

ConsoleKeyInfoオブジェクトの取得

Console.ReadKeyメソッドが返すConsoleKeyInfoオブジェクトには、押されたキーに関する詳細情報が含まれています。

このオブジェクトを使用することで、押されたキーの文字、キーコード、修飾キーの状態を確認することができます。

以下のサンプルコードでは、ConsoleKeyInfoオブジェクトを使用して、押されたキーの情報を取得し表示します。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("任意のキーを押してください...");
        // キー入力を待機
        ConsoleKeyInfo keyInfo = Console.ReadKey(); 
        // 押されたキーの情報を表示
        Console.WriteLine($"\n押されたキー: {keyInfo.KeyChar}");
        Console.WriteLine($"キーコード: {keyInfo.Key}");
        Console.WriteLine($"Shiftキーが押されているか: {keyInfo.Modifiers.HasFlag(ConsoleModifiers.Shift)}");
    }
}
任意のキーを押してください...
押されたキー: B
キーコード: B
Shiftキーが押されているか: False

キー入力の表示と非表示の切り替え

Console.ReadKeyメソッドには、引数としてtrueまたはfalseを指定することができます。

trueを指定すると、押されたキーがコンソールに表示されず、falseを指定すると表示されます。

これにより、ユーザーの入力を隠すことができます。

以下のサンプルコードでは、キー入力を非表示にする方法を示します。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("任意のキーを押してください(表示されません)...");
        // キー入力を待機(表示しない)
        ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
        // 押されたキーを表示
        Console.WriteLine($"\n押されたキー: {keyInfo.KeyChar}");
    }
}
任意のキーを押してください(表示されません)...
押されたキー: C  // 例としてCキーを押した場合

ConsoleKeyInfoオブジェクトの詳細

キーコードの取得方法

ConsoleKeyInfoオブジェクトには、押されたキーの情報が含まれています。

その中でも、Keyプロパティを使用することで、押されたキーのキーコードを取得できます。

キーコードは、ConsoleKey列挙体の値として表現され、特定のキーを識別するために使用されます。

以下のサンプルコードでは、押されたキーのキーコードを取得し、表示します。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("任意のキーを押してください...");
        // キー入力を待機
        ConsoleKeyInfo keyInfo = Console.ReadKey(); 
        // 押されたキーのキーコードを表示
        Console.WriteLine($"\n押されたキーのキーコード: {keyInfo.Key}");
    }
}
任意のキーを押してください...
押されたキーのキーコード: A  // 例としてAキーを押した場合

修飾キーの判定

ConsoleKeyInfoオブジェクトには、押されたキーに加えて、修飾キー(Shift、Ctrl、Altなど)の状態も含まれています。

Modifiersプロパティを使用することで、どの修飾キーが押されているかを判定できます。

これにより、特定のキーの組み合わせに応じた処理を実装することが可能です。

以下のサンプルコードでは、Shiftキーが押されているかどうかを判定し、その結果を表示します。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("任意のキーを押してください...");
        // キー入力を待機
        ConsoleKeyInfo keyInfo = Console.ReadKey(); 
        // 修飾キーの状態を判定
        bool isShiftPressed = keyInfo.Modifiers.HasFlag(ConsoleModifiers.Shift);
        bool isCtrlPressed = keyInfo.Modifiers.HasFlag(ConsoleModifiers.Control);
        bool isAltPressed = keyInfo.Modifiers.HasFlag(ConsoleModifiers.Alt);
        // 判定結果を表示
        Console.WriteLine($"\nShiftキーが押されているか: {isShiftPressed}");
        Console.WriteLine($"Ctrlキーが押されているか: {isCtrlPressed}");
        Console.WriteLine($"Altキーが押されているか: {isAltPressed}");
    }
}
任意のキーを押してください...
A
Shiftキーが押されているか: True
Ctrlキーが押されているか: False
Altキーが押されているか: True

入力された文字の取得

ConsoleKeyInfoオブジェクトのKeyCharプロパティを使用することで、押されたキーに対応する文字を取得できます。

このプロパティは、通常の文字キーが押された場合に、その文字を返します。

特定のキー(例えば、ファンクションキーや矢印キーなど)については、KeyCharは空の文字を返します。

以下のサンプルコードでは、押されたキーの文字を取得し、表示します。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("任意のキーを押してください...");
        // キー入力を待機
        ConsoleKeyInfo keyInfo = Console.ReadKey(); 
        // 押されたキーの文字を表示
        Console.WriteLine($"\n押されたキーの文字: {keyInfo.KeyChar}");
    }
}
任意のキーを押してください...
押されたキーの文字: D  // 例としてDキーを押した場合

キー入力を用いた基本的なプログラム

単一キー入力の処理

単一キー入力の処理は、ユーザーが1つのキーを押したときにその入力を受け取り、特定のアクションを実行する基本的な方法です。

Console.ReadKeyメソッドを使用して、ユーザーの入力を待機し、押されたキーに応じた処理を行います。

以下のサンプルコードでは、ユーザーが押したキーに応じて異なるメッセージを表示します。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("AまたはBキーを押してください...");
        // キー入力を待機
        ConsoleKeyInfo keyInfo = Console.ReadKey(); 
        // 押されたキーに応じた処理
        if (keyInfo.KeyChar == 'A' || keyInfo.KeyChar == 'a')
        {
            Console.WriteLine("\nAキーが押されました。");
        }
        else if (keyInfo.KeyChar == 'B' || keyInfo.KeyChar == 'b')
        {
            Console.WriteLine("\nBキーが押されました。");
        }
        else
        {
            Console.WriteLine("\nAまたはB以外のキーが押されました。");
        }
    }
}
AまたはBキーを押してください...
Aキーが押されました。  // 例としてAキーを押した場合

複数キーの連続入力処理

複数キーの連続入力処理では、ユーザーが複数のキーを順番に押すことを想定し、それに応じた処理を行います。

ループを使用して、ユーザーが特定のキーを押すまで入力を受け付け続けることができます。

以下のサンプルコードでは、ユーザーが押したキーを連続して表示し、Escキーが押されるまで続けます。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("キーを押してください。Escキーで終了します。");
        while (true)
        {
            // キー入力を待機
            ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
            // Escキーが押された場合、ループを終了
            if (keyInfo.Key == ConsoleKey.Escape)
            {
                Console.WriteLine("\n終了します。");
                break;
            }
            // 押されたキーを表示
            Console.WriteLine($"押されたキー: {keyInfo.KeyChar}");
        }
    }
}
キーを押してください。Escキーで終了します。
押されたキー: X  // 例としてXキーを押した場合
押されたキー: Y  // 例としてYキーを押した場合
終了します。

特殊キーの処理

特殊キー(ファンクションキーや矢印キーなど)の処理は、通常の文字キーとは異なる方法で行います。

ConsoleKeyInfoオブジェクトのKeyプロパティを使用して、押された特殊キーを判定し、それに応じた処理を実行します。

以下のサンプルコードでは、矢印キーが押された場合にその方向を表示します。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("矢印キーを押してください。Escキーで終了します。");
        while (true)
        {
            // キー入力を待機
            ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
            // Escキーが押された場合、ループを終了
            if (keyInfo.Key == ConsoleKey.Escape)
            {
                Console.WriteLine("\n終了します。");
                break;
            }
            // 矢印キーの処理
            switch (keyInfo.Key)
            {
                case ConsoleKey.UpArrow:
                    Console.WriteLine("上矢印キーが押されました。");
                    break;
                case ConsoleKey.DownArrow:
                    Console.WriteLine("下矢印キーが押されました。");
                    break;
                case ConsoleKey.LeftArrow:
                    Console.WriteLine("左矢印キーが押されました。");
                    break;
                case ConsoleKey.RightArrow:
                    Console.WriteLine("右矢印キーが押されました。");
                    break;
                default:
                    Console.WriteLine("矢印キー以外が押されました。");
                    break;
            }
        }
    }
}
矢印キーを押してください。Escキーで終了します。
上矢印キーが押されました。  // 例として上矢印キーを押した場合
右矢印キーが押されました。  // 例として右矢印キーを押した場合
終了します。

応用例:キー入力を用いたインタラクティブなコンソールアプリケーション

簡易メニューの実装

簡易メニューを実装することで、ユーザーが選択肢から操作を選ぶことができるインタラクティブなコンソールアプリケーションを作成できます。

Console.ReadKeyメソッドを使用して、ユーザーの入力を受け取り、選択されたメニューに応じた処理を実行します。

以下のサンプルコードでは、簡単なメニューを表示し、ユーザーが選択したオプションに応じてメッセージを表示します。

using System;
class Program
{
    static void Main()
    {
        while (true)
        {
            Console.WriteLine("メニュー:");
            Console.WriteLine("1: オプション1");
            Console.WriteLine("2: オプション2");
            Console.WriteLine("3: 終了");
            Console.Write("選択してください: ");
            // キー入力を待機
            ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
            // 選択されたオプションに応じた処理
            switch (keyInfo.KeyChar)
            {
                case '1':
                    Console.WriteLine("オプション1が選択されました。");
                    break;
                case '2':
                    Console.WriteLine("オプション2が選択されました。");
                    break;
                case '3':
                    Console.WriteLine("終了します。");
                    return; // プログラムを終了
                default:
                    Console.WriteLine("無効な選択です。");
                    break;
            }
        }
    }
}
メニュー:
1: オプション1
2: オプション2
3: 終了
選択してください: 1
オプション1が選択されました。

ゲームの操作入力

ゲームの操作入力では、ユーザーがキーボードを使ってキャラクターを操作することができます。

矢印キーや特定のキーを使用して、キャラクターの動きを制御します。

以下のサンプルコードでは、ユーザーが矢印キーを押すことでキャラクターの位置を変更する簡単なゲームの例を示します。

using System;
class Program
{
    static void Main()
    {
        int positionX = 0;
        int positionY = 0;
        Console.WriteLine("キャラクターを操作します。矢印キーで移動、Escキーで終了します。");
        while (true)
        {
            // キー入力を待機
            ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
            // Escキーが押された場合、ループを終了
            if (keyInfo.Key == ConsoleKey.Escape)
            {
                Console.WriteLine("\n終了します。");
                break;
            }
            // 矢印キーの処理
            switch (keyInfo.Key)
            {
                case ConsoleKey.UpArrow:
                    positionY++;
                    break;
                case ConsoleKey.DownArrow:
                    positionY--;
                    break;
                case ConsoleKey.LeftArrow:
                    positionX--;
                    break;
                case ConsoleKey.RightArrow:
                    positionX++;
                    break;
                default:
                    Console.WriteLine("無効なキーです。");
                    continue; // 無効なキーはスキップ
            }
            // 現在の位置を表示
            Console.WriteLine($"キャラクターの位置: ({positionX}, {positionY})");
        }
    }
}
キャラクターを操作します。矢印キーで移動、Escキーで終了します。
キャラクターの位置: (0, 1)  // 上矢印キーを押した場合
キャラクターの位置: (1, 1)  // 右矢印キーを押した場合
終了します。

テキストエディタの基本機能

テキストエディタの基本機能を実装することで、ユーザーがテキストを入力し、編集することができるアプリケーションを作成できます。

ここでは、簡単なテキストエディタの機能を実装し、ユーザーが入力したテキストを表示します。

以下のサンプルコードでは、ユーザーが入力した文字を表示し、Escキーで終了する簡単なテキストエディタの例を示します。

using System;
using System.Text;
class Program
{
    static void Main()
    {
        StringBuilder text = new StringBuilder();
        Console.WriteLine("テキストを入力してください。Escキーで終了します。");
        while (true)
        {
            // キー入力を待機
            ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
            // Escキーが押された場合、ループを終了
            if (keyInfo.Key == ConsoleKey.Escape)
            {
                Console.WriteLine("\n終了します。");
                break;
            }
            // 入力された文字を追加
            text.Append(keyInfo.KeyChar);
            Console.Write(keyInfo.KeyChar); // 入力された文字を表示
        }
        // 最終的なテキストを表示
        Console.WriteLine($"\n入力されたテキスト: {text.ToString()}");
    }
}
テキストを入力してください。Escキーで終了します。
Hello World!  // 例として `Hello World!` と入力した場合
終了します。
入力されたテキスト: Hello World!

よくある質問

Console.ReadKeyとConsole.ReadLineの違いは?

Console.ReadKeyConsole.ReadLineは、どちらもユーザーからの入力を取得するためのメソッドですが、以下のような違いがあります。

  • Console.ReadKey:
  • ユーザーが1つのキーを押すまで待機します。
  • 押されたキーの情報(文字、キーコード、修飾キーの状態)を含むConsoleKeyInfoオブジェクトを返します。
  • 入力されたキーは、表示するかどうかを選択できます(引数にtrueを指定すると非表示)。
  • Console.ReadLine:
  • ユーザーがEnterキーを押すまで、1行の入力を待機します。
  • 入力された文字列をそのまま返します。
  • 複数の文字を一度に取得でき、改行を含むことはありません。

キー入力を非同期で取得する方法はある?

C#の標準ライブラリには、コンソールアプリケーションでのキー入力を非同期に取得するための直接的な方法はありません。

ただし、非同期プログラミングを利用するために、別スレッドを使用してキー入力を監視することができます。

以下のような方法があります。

  • Task.Runを使用: 別スレッドでConsole.ReadKeyを実行し、メインスレッドで他の処理を行うことができます。
  • Windows FormsやWPFを使用: GUIアプリケーションに移行することで、非同期のイベント駆動型のキー入力処理が可能になります。

特定のキー入力を無視する方法は?

特定のキー入力を無視するには、Console.ReadKeyで取得したConsoleKeyInfoオブジェクトのKeyプロパティを使用して、無視したいキーを判定し、その場合は何も処理を行わないようにします。

以下のような方法で実装できます。

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("任意のキーを押してください(AとB以外は無視されます)...");
        while (true)
        {
            // キー入力を待機
            ConsoleKeyInfo keyInfo = Console.ReadKey(true); 
            // AとB以外のキーは無視
            if (keyInfo.Key != ConsoleKey.A && keyInfo.Key != ConsoleKey.B)
            {
                continue; // 無視
            }
            // 有効なキーが押された場合の処理
            Console.WriteLine($"押されたキー: {keyInfo.KeyChar}");
        }
    }
}

このように、特定のキーを無視することで、ユーザーの入力を制御することができます。

まとめ

この記事では、C#のコンソールアプリケーションにおけるキー入力の取得方法について詳しく解説しました。

具体的には、Console.ReadKeyメソッドを使用した基本的なキー入力の処理から、応用例として簡易メニューやゲームの操作入力、テキストエディタの基本機能まで幅広く取り上げました。

これらの知識を活用して、インタラクティブなコンソールアプリケーションを作成することができるでしょう。

ぜひ、実際にコードを試してみて、さまざまな機能を実装してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す