【问题标题】:How to open Console during runtime [C++/Visual Studio]如何在运行时打开控制台 [C++/Visual Studio]
【发布时间】:2018-03-13 20:04:38
【问题描述】:

目前,我正在使用 Visual Studio 开发 SDL 应用程序。 现在,如果我想打开控制台以查看输出,我必须输入“项目的属性 > 链接器 > 系统 > 子系统 > 控制台”才能启用它。但是,当我准备好导出时,我将其禁用。

但是,我想知道在运行时是否有任何方法可以打开(甚至关闭)控制台窗口。具体来说,我希望能够在应用程序运行时按一个键以打开控制台并查看输出。

我尝试使用 windows.h 中的 AllocConsole,但它确实打开了一个控制台窗口,但它似乎没有显示当我手动将应用程序设置为使用控制台窗口时通常出现的输出。

(或者,我一直在想我可以打开第二个 SDL 窗口并在那里显示所有输出,但我不知道如何将所有输出从应用程序流式传输到自身。可能不是最方便的解决方案,但会工作也。)

【问题讨论】:

    标签: c++ windows visual-studio sdl-2


    【解决方案1】:

    你可以使用

    if (::GetConsoleWindow() == NULL)
    {
      if (::AllocConsole())
      {
        (void)freopen("CONIN$", "r", stdin);
        (void)freopen("CONOUT$", "w", stdout);
        (void)freopen("CONOUT$", "w", stderr);
    
        SetFocus(::GetConsoleWindow());
      }
    }
    

    就在使用printf之前

    【讨论】:

    • 太棒了!非常感谢!但是,我将如何关闭它?
    • 要分离,首先freopen标准流到“NUL”设备,或者干脆关闭它们,然后调用FreeConsole()。不要关闭控制台窗口,因为这将终止连接到控制台的所有进程。 (如果你关闭了窗口,如果一个进程有一个控制处理程序,它会得到一个CTRL_CLOSE_EVENT,但如果它没有在 5 秒内自行退出,它会被 Windows 终止。)
    • GetConsoleWindow 也将返回 NULL 如果进程附加到没有窗口的控制台,例如CreateProcess 使用标志 CREATE_NO_WINDOW 调用。在这种情况下,您可以检查SetLastError(0); codepage = GetConsoleCP()。如果返回的代码页不为零,或者GetLastError() 不是ERROR_INVALID_HANDLE,那么如果您想实际看到输出,则需要分离并分配一个新控制台。
    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2016-05-24
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多