2015-10-26 109 views
3

我对C#相当陌生,我很感谢您的贡献。Combine ConsoleModifiers和ConsoleKey

目前,我有我的下面一行代码: while (Console.ReadKey().Key != ConsoleKey.Q) { } //Exit on Q

因此,大家可以看到,在一个控制台应用程序,如果用户按下Q退出应用程序。精细。现在,问题是:有什么方法可以合并ConsoleModifiersConsoleKey?而不是使用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

的Console.ReadKey()方法中包含相关信息的微软的文档:https://msdn.microsoft.com/en-us/library/471w8d85(v=vs.110).aspx

尤其ConsoleKeyInfo有一个修饰语会员,您可以测试(其中长江基建是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())) 
{ 

} 

你必须检查KeyControl财产

+0

使用func的好格式。 +1 –

+0

这真的很棒。谢谢! – AuroMetal