首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Console.ReadKey()生成异常

Console.ReadKey()生成异常
EN

Stack Overflow用户
提问于 2021-05-21 16:32:17
回答 1查看 213关注 0票数 0

我已经创建了一个Windows窗体应用程序。在特殊情况下,我打开一个控制台窗口

代码语言:javascript
复制
    public static void CreateConsole() {
        AllocConsole();
    }


    [DllImport("kernel32")]
    private static extern bool AllocConsole();

当我打电话给Console.ReadKey()后,我得到了一个InvalidOperationException

当应用程序没有控制台或控制台输入已从文件重定向时,无法读取键。试试Console.Read。

当我使用Console.Read()时,它将无法工作。没有击键被识别。

有人能帮我吗,这里有什么问题吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-10 23:38:35

如您所见,输出转到Visual控制台,而不是打开控制台。要解决这个问题,您需要重新打开控制台输出流:

代码语言:javascript
复制
if (AllocConsole())
{
    var outHandle = CreateFile("CONOUT$", 
        (uint)(FileConsts.FILE_GENERIC_WRITE | FileConsts.FILE_GENERIC_READ), 
        (uint)(FileConsts.FILE_SHARE_WRITE | FileConsts.FILE_SHARE_READ), 
        0,
        FileConsts.OPEN_EXISTING,
        FileConsts.FILE_ATTRIBUTE_NORMAL, 0);
   
    var inHandle = CreateFile("CONIN$",
        (uint)(FileConsts.FILE_GENERIC_WRITE | FileConsts.FILE_GENERIC_READ),
        (uint)(FileConsts.FILE_SHARE_WRITE | FileConsts.FILE_SHARE_READ),
        0,
        FileConsts.OPEN_EXISTING,
        FileConsts.FILE_ATTRIBUTE_NORMAL, 0);

    if (!SetStdHandle(STD_OUTPUT_HANDLE, outHandle))
        throw new Exception("Can't set std handle");

    if (!SetStdHandle(STD_INPUT_HANDLE, inHandle))
        throw new Exception("Can't set std handle");

    //Just for handle .Dispose();
    var fileStream = new FileStream(new SafeFileHandle(outHandle, true), FileAccess.Write);
    var fileStreamRead = new FileStream(new SafeFileHandle(inHandle, true), FileAccess.Read);

    ConsoleKey read;
    while ((read = Console.ReadKey().Key) != ConsoleKey.Escape)
    {
        Console.WriteLine($"Printed {read}");
    }

    Console.WriteLine("Escape Pressed, exiting");

    SetStdHandle(STD_INPUT_HANDLE, IntPtr.Zero);
    SetStdHandle(STD_OUTPUT_HANDLE, IntPtr.Zero);
    fileStream.Dispose();
    fileStreamRead.Dispose();
    FreeConsole();
}

请注意,new FileStream("CONOUT$", ...)Console.OpenStandardInput()不能工作。我刚刚用Windows.Forms应用程序测试了它。Console.ReadKey对我来说是正确的。创建文件和常量来自kernel32.dll

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67640707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档