Как проверить, нажата ли клавиша CTRL в консольном приложении C#
Я собираюсь запустить консольное приложение. проблема в том, как определить, что клавиша 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", он начинает читать клавишу с клавиатуры
2 ответа
Если вы не используете.Net Framework старше версии 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