2015-10-26 2 views
3

Я довольно новичок в C#, и я был бы признателен за ваш вклад.Combine ConsoleModifiers and ConsoleKey

На данный момент у меня есть следующие строки в моем коде: while (Console.ReadKey().Key != ConsoleKey.Q) { } //Exit on Q

Так как вы можете видеть, на консольном приложении, если пользователь нажимает Q завершает программу. Хорошо. Теперь встает вопрос: есть ли способ объединить ConsoleModifiers плюс ConsoleKey? Вместо того, чтобы использовать ключ Q, я бы предпочел использовать Ctrl+Q при выходе.

Причина, по которой я хочу достичь этого, заключается в том, что я не чувствую себя комфортно оставлять только один ключ при выходе (позволяет легко предотвратить, что кто-то случайно его нажал). Несмотря на то, что синтаксис совершенно неверен, этого я бы хотел достичь: ConsoleModifiers.Control + ConsoleKey.Q

Заранее спасибо.

ответ

3

Вы можете хранить ConsoleKeyInfo в переменной и проверять для обоих параметров.

ConsoleKeyInfo c; 
while ((c = Console.ReadKey()).Modifiers != ConsoleModifiers.Control 
     || c.Key != ConsoleKey.Q) { } //Exit on Ctrl + Q 
+0

Абсолютно блестящий, это именно то, что я искал! Большое спасибо. – AuroMetal

1

документации Microsoft, в Console.ReadKey() метод содержит соответствующую информацию: https://msdn.microsoft.com/en-us/library/471w8d85(v=vs.110).aspx

В частности, ConsoleKeyInfo имеет элемент Модификаторы вы можете испытать для (где CKI является экземпляром ConsoleKeyInfo):

if((cki.Modifiers & ConsoleModifiers.Control) != 0) Console.Write("CTL+"); 

Полный код:

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); 
    } 
+0

Спасибо большое, что действительно стоит взглянуть на. Но в этом конкретном случае я хотел бы ответить на @ M.Kazem Akhgary. – AuroMetal

2

это должно сделать это

Func<ConsoleKeyInfo, bool> CheckKey = x => x.Key != ConsoleKey.Q || x.Modifiers != ConsoleModifiers.Control;  
while (CheckKey(Console.ReadKey())) 
{ 

} 

вы должны проверить Key и Control свойство

+0

красивый формат, используя func. +1 –

+0

Это действительно здорово. Благодаря! – AuroMetal