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);

        }

этот код поможет вам в вашей проблеме, просто имейте в виду, что когда вы читаете строку с символами, вам нужно обрабатывать такие вещи, как возврат

Другие вопросы по тегам