如何在控制台应用程序中处理按键事件

本文关键字:处理 事件 应用程序 控制台 | 更新日期: 2023-09-27 18:20:46

我想创建一个控制台应用程序,它将显示在控制台屏幕上按下的键,到目前为止,我编写了以下代码:

    static void Main(string[] args)
    {
        // this is absolutely wrong, but I hope you get what I mean
        PreviewKeyDownEventArgs += new PreviewKeyDownEventArgs(keylogger);
    }
    private void keylogger(KeyEventArgs e)
    {
        Console.Write(e.KeyCode);
    }

我想知道,我应该在main中键入什么,以便可以调用该事件?

如何在控制台应用程序中处理按键事件

对于可以执行此操作的控制台应用程序,do while循环将运行,直到您按下x

public class Program
{
    public static void Main()
    {
        ConsoleKeyInfo keyinfo;
        do
        {
            keyinfo = Console.ReadKey();
            Console.WriteLine(keyinfo.Key + " was pressed");
        }
        while (keyinfo.Key != ConsoleKey.X);
    }
}

只有当控制台应用程序具有焦点时,这才会起作用。如果你想收集系统范围内的按键事件,你可以使用windows挂钩

不幸的是,Console类没有为用户输入定义任何事件,但如果您希望输出当前按下的字符,您可以执行以下操作:

 static void Main(string[] args)
 {
     //This will loop indefinitely 
     while (true)
     {
         /*Output the character which was pressed. This will duplicate the input, such
          that if you press 'a' the output will be 'aa'. To prevent this, pass true to
          the ReadKey overload*/
         Console.Write(Console.ReadKey().KeyChar);
     }
 }

Console.ReadKey返回一个ConsoleKeyInfo对象,该对象封装了许多关于按下的键的信息。

另一个解决方案,我在基于文本的冒险中使用了它。

        ConsoleKey choice;
        do
        {
           choice = Console.ReadKey(true).Key;
            switch (choice)
            {
                // 1 ! key
                case ConsoleKey.D1:
                    Console.WriteLine("1. Choice");
                    break;
                //2 @ key
                case ConsoleKey.D2:
                    Console.WriteLine("2. Choice");
                    break;
            }
        } while (choice != ConsoleKey.D1 && choice != ConsoleKey.D2);