如何避免不必要的控制台窗口

Posted

技术标签:

【中文标题】如何避免不必要的控制台窗口【英文标题】:How to avoid the unnecessary console window 【发布时间】:2015-08-15 11:59:18 【问题描述】:

我对c++不是很熟悉。当我编译并运行以下代码时,还会打开一个带有消息框的控制台窗口。我需要知道为什么,以及如何避免该控制台窗口。 我检查了重复的问题,但还没有找到正确的答案。

#include <Windows.h>
int main()

    char* title = "Message box title";
    char* message = "I am working";

    MessageBox(NULL, message, title, MB_OK | MB_ICONEXCLAMATION );
    return 0;

【问题讨论】:

第一个选择创建 WinForms 应用程序。 您正在创建一个控制台应用程序,而应该创建一个 win32 应用程序。 我希望有更好的 cmets,例如“抛出这些头文件并调用这些方法而不是那个”。无论谁对我的问题投了反对票,请提出一种更好的提问方式,而不是投反对票。 @Scevola 然后问better questions。 我投票决定重新提出这个问题,因为对提议的副本的答案并没有真正解决这个问题。 this 问题的答案是:编写一个在 WINDOWS 子系统而不是 CONSOLE 子系统中运行的应用程序。 【参考方案1】:

当您为 CONSOLE 子系统创建应用程序时(使用 /SUBSYSTEM:CONSOLE 链接器开关),系统会自动分配一个控制台。

如果您不希望系统为您的进程分配控制台,请指定/SUBSYSTEM:WINDOWS 链接器开关。这也需要不同的应用程序入口点签名:

int APIENTRY wWinMain( HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPWSTR    lpCmdLine,
                       int       nCmdShow ) 

    const wchar_t* title = L"Message box title";
    const wchar_t* message = L"I am working";

    MessageBoxW( NULL, message, title, MB_OK | MB_ICONEXCLAMATION );
    return 0;

使用 Visual Studio 时,您可以通过项目设置 GUI 更改子系统:


请注意,我将字符编码更改为使用 Unicode。这是 Windows 内部使用的默认编码。要让编译器选择wWinMain 入口点,您需要在项目设置中相应地设置字符编码(General -> Character Set: Use Unicode Character Set)。

【讨论】:

以上是关于如何避免不必要的控制台窗口的主要内容,如果未能解决你的问题,请参考以下文章

在TCP的拥塞控制中,啥是慢开始、拥塞避免、快重传和快恢复算法

如何在 XCode 中创建多个控制台窗口

如何从 C++/MFC 程序中获取控制台窗口? [复制]

TCP流量控制和拥塞避免

使用 React 钩子 useContext 避免不必要的重新渲染

如何避免存储过程中不必要的重新编译?