如何在控制台应用程序c#中检查是否按下了CTRL键

本文关键字:是否 CTRL 检查 控制台 应用程序 | 更新日期: 2023-09-27 18:20:28

我要启动一个控制台应用程序。问题是如何确定在没有任何其他键的情况下单独按下CTRL键。

using System;
using System.Text;
public class ConsoleKeyExample
{
   public static void Main()
    {
       ConsoleKeyInfo input;
       do
       {
           input = Console.ReadKey(true);
           StringBuilder output = new StringBuilder(String.Format("You pressed {0}",input.Key.ToString()));
           Console.WriteLine(output.ToString());
           if ((input.Modifiers & ConsoleModifiers.Control) != 0)
           {
               Console.WriteLine("CTRL Pressed");
            }
       } while (input.Key != ConsoleKey.Escape);
   }
  }

我想监视CTRL键的行为。在跟踪了这段代码之后,我在readkey行上设置了一个检查点,但当我按下CTRL时,什么都没有发生,但当我们按下任何其他键时,比如";K〃;它开始从键盘上读键。

如何在控制台应用程序c#中检查是否按下了CTRL键

除非您使用的.Net框架版本早于4.0,否则我相信使用Enum.HasFlag()比使用位AND更可读。

例如

if (cki.Modifiers.HasFlag(ConsoleModifiers.Control))
{
   Console.Write("CTRL ");
}

我不知道为什么MSDN文章没有更新为使用标志,因为ConsoleModifiers确实支持flags属性。

以下是在框架4.0及更高版本上运行的同一程序的更新副本。

static void Main(string[] args)
{
    ConsoleKeyInfo cki;
    Console.WriteLine("Press Esc to exit the loop");
    do
    {
        cki = Console.ReadKey(true);
        if (cki.Modifiers.HasFlag(ConsoleModifiers.Control))
        {
            Console.Write("CTRL ");
        }
        if (cki.Modifiers.HasFlag(ConsoleModifiers.Alt))
        {
            Console.Write("ALT ");
        }
        if (cki.Modifiers.HasFlag(ConsoleModifiers.Shift))
        {
            Console.Write("SHIFT ");
        }
        Console.WriteLine(cki.Key.ToString());
    } while (cki.Key != ConsoleKey.Escape);

    Console.WriteLine("Press any key to exit");
    Console.ReadKey();
}

是的,可以使用ConsoleKeyInfo。示例:

public static void Main() 
{
  ConsoleKeyInfo cki;
  // Prevent example from ending if CTL+C is pressed.
  Console.TreatControlCAsInput = true;
  Console.WriteLine("Press any combination of CTL, ALT, and SHIFT, and a console key.");
  Console.WriteLine("Press the Escape (Esc) key to quit: 'n");
  do 
  {
     cki = Console.ReadKey();
     Console.Write(" --- You pressed ");
     if((cki.Modifiers & ConsoleModifiers.Alt) != 0) Console.Write("ALT+");
     if((cki.Modifiers & ConsoleModifiers.Shift) != 0) Console.Write("SHIFT+");
     if((cki.Modifiers & ConsoleModifiers.Control) != 0) Console.Write("CTL+");
     Console.WriteLine(cki.Key.ToString());
   } while (cki.Key != ConsoleKey.Escape);
}

尽管仅适用于.NET Framework 4.6和4.5