C# Завершение программы с помощью комбинации клавиш без нажатия клавиши ввода во время чтения
Теперь вот ситуация, в которой мы находимся:
getinput:
//things happen here
string typed = Console.ReadLine();
try
if (typed == "com")
{
//things happen here
}
else if (Console.ReadKey(true).Key == (ConsoleKey.F1) + (ConsoleModifiers.Alt))
{
System.Environment.Exit(0);
}
//other else if's happen here
else
{
Console.WriteLine("\n" + typed + " isn't an option.");
goto getInput;
}
}
catch (Exception)
{
}
goto getInput;
то, что я хочу сделать с этим, когда я нажимаю alt + f1, программа завершает сам, однако, потому что программа ждет некоторого ввода от меня, чтобы написать даже с рабочей версией (без части alt), она хочет, чтобы я набрал вещи тогда нажмите Enter, чего я не хочу. как это сделать??
2 ответа
Прежде всего, пожалуйста, рассмотрите возможность использования циклов вместо goto
, как goto
с опасны. Зачем? Посмотрите здесь: "Goto" это плохо?
Для решения вашей проблемы вы можете использовать ConsoleKeyInfo
класс в сочетании с Console.ReadKey()
метод получения информации об однократном нажатии клавиш. При этом вы можете проверить любую комбинацию клавиш прямо перед добавлением отдельных символов в строку. Рабочий пример может выглядеть так:
namespace Stackru
{
using System;
class Program
{
public static void Main(string[] args)
{
ConsoleKeyInfo keyInfo = default(ConsoleKeyInfo);
string input = string.Empty;
// loop while condition is true
while (true)
{
// read input character-wise as long as user presses 'Enter' or 'Alt+F1'
while (true)
{
// read a single character and print it to console
keyInfo = Console.ReadKey(false);
// check for close-combination
if (keyInfo.Key == ConsoleKey.F1 && (keyInfo.Modifiers & ConsoleModifiers.Alt) != 0)
{
// program terminates
Environment.Exit(0);
}
// check for enter-press
if (keyInfo.Key == ConsoleKey.Enter)
{
// break out of the loop without adding '\r' to the input string
break;
}
// add up input-string
input += keyInfo.KeyChar;
}
// optional: enter was pressed - add a new line
Console.WriteLine();
// user pressed enter, do something with the input
try
{
if (input == "com")
{
// right option - do something
}
else
{
// wrong option - reset ConsoleKeyInfo + input
Console.WriteLine("\n" + input + " isn't an option.");
keyInfo = default(ConsoleKeyInfo);
input = string.Empty;
continue;
}
}
catch (Exception)
{
// handle exceptions
}
}
}
}
}
static void Main(string[] args)
{
Console.TreatControlCAsInput = true;
var typed = ReadLine();
if (typed == "com")
{
Console.WriteLine("com");
//things happen here
}
//other else if's happen here
else
{
Console.WriteLine("\n" + typed + " isn't an option.");
}
}
public static string ReadLine() {
StringBuilder sb = new StringBuilder();
do
{
ConsoleKeyInfo key = Console.ReadKey();
if ((key.Modifiers & ConsoleModifiers.Alt) != 0)
{
if (key.Key == ConsoleKey.K)
{
Console.WriteLine("killing console");
System.Environment.Exit(0);
}
}
else
{
sb.Append(key.KeyChar);
if (key.KeyChar == '\n'||key.Key==ConsoleKey.Enter)
{
return sb.ToString();
}
}
} while (true);
}
этот код поможет вам в вашей проблеме, просто имейте в виду, что когда вы читаете строку с символами, вам нужно обрабатывать такие вещи, как возврат