C# 检测Ctrl+;在控制台里有什么

C# 检测Ctrl+;在控制台里有什么,c#,input,console,modifiers,C#,Input,Console,Modifiers,我正在开发一个控制台应用程序,其中需要检测几个热键,如Ctrl+N、Ctrl+O和Ctrl+S。下面是我用来识别这些热键的部分代码: ConsoleKeyInfo input = Console.ReadKey(true); if (input.Modifiers == ConsoleModifiers.Control) { if (input.Key == ConsoleKey.N) { // ... } else if (input.Key

我正在开发一个控制台应用程序,其中需要检测几个热键,如Ctrl+N、Ctrl+O和Ctrl+S。下面是我用来识别这些热键的部分代码:

ConsoleKeyInfo input = Console.ReadKey(true);

if (input.Modifiers == ConsoleModifiers.Control)
{
    if (input.Key == ConsoleKey.N)
    {
        // ...
    }
    else if (input.Key == ConsoleKey.O)
    {
        // ...
    }
    else if (input.Key == ConsoleKey.S)
    {
        //...
    }
}
上面的代码对Ctrl+N和Ctrl+O没有任何问题。但是,我无法让它对Ctrl+S起作用。在做了一些快速测试后,我发现按Ctrl+S甚至没有任何作用(意味着程序仍在等待用户键入内容)

此问题仅在Ctrl+S时出现。对任何其他修饰符(例如Shift)和键(N、O等)使用一些简单的
if
语句都可以正常工作

为什么会发生这种情况?Ctrl+S组合是否有特殊意义?有可能做到这一点吗?如果是,如何解决?

在的帮助下,我为自己的控制台应用程序想出了这个解决方案

protected override  bool  ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (msg.Msg == 256)
    {
        //if the user pressed control + s
        if (keyData == (Keys.Control | Keys.S))
        {

        }
        //if the user pressed control + o 
        else if (keyData == (Keys.Control | Keys.O))
        {

        }
        //if the user pressed control + n 
        else if (keyData == (Keys.Control | Keys.N))
        {

        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
您需要通过使用并传递“
ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS
(如oconnor0建议的那样)”来配置控制台

导入所需的内核函数:

[DllImport(“kernel32.dll”,SetLastError=true)]
静态外部布尔设置控制台模式(IntPtr hConsoleHandle,uint dwMode);
[旗帜]
私有枚举控制台输入模式:uint
{
启用\u已处理\u输入=0x0001,
启用线输入=0x0002,
启用_ECHO_输入=0x0004,
启用\u窗口\u输入=0x0008,
启用鼠标输入=0x0010,
启用插入模式=0x0020,
启用快速编辑模式=0x0040,
启用扩展\u标志=0x0080,
启用自动位置=0x0100
}
[旗帜]
私有枚举控制台输出模式:uint
{
启用\u已处理\u输出=0x0001,
在下线输出=0x0002时启用换行,
启用虚拟终端处理=0x0004,
禁用新行自动返回=0x0008,
在全球范围内启用网格=0x0010
}
[DllImport(“kernel32.dll”,SetLastError=true)]
静态外部IntPtr GetStdHandle(intnstdhandle);
静态int标准输入句柄=-10;
并在程序中使用它们,如下所示:

//将此部分添加到代码中:
SetConsoleMode(GetStdHandle(标准输入句柄),(uint)(
控制台输入模式。启用\u窗口\u输入|
控制台输入模式。启用鼠标输入|
ConsoleInputModes.ENABLE\u扩展\u标志
));
// ------------------------------
ConsoleKeyInfo输入=Console.ReadKey(true);
if(input.Modifiers==ConsoleModifiers.Control)
{
if(input.Key==ConsoleKey.N)
{
// ...
}
else if(input.Key==ConsoleKey.O)
{
// ...
}
else if(input.Key==ConsoleKey.S)
{
//...
}
}

此解决方案不仅允许您捕获Ctrl+S击键,还可以捕获Ctrl+C

控制台程序捕获CTRL-S以暂停输出。这就是为什么它没有传递给您的应用程序。我不知道如何禁用它。我也发现了这个:这个应该如何命名?
msg
keyData
来自哪里?