1

如何在程序启动-mwindows使用 mingw 编译器抑制 c++ 应用程序的命令提示符。在链接器设置中效果很好,但我希望能够在程序运行时切换它,这可能吗?

我正在使用文本编辑器和命令行,所以请不要与 IDE 相关的答案。

4

2 回答 2

2

据我所知:,至少不是一个可执行文件。当您在基于 Windows 的控制台中打开应用程序时,它将启动一个实例,conhost.exe以便为您的命令行应用程序提供环境。只要您的应用程序尚未退出,控制台主机就会运行。

很难确定在哪些情况下需要这种行为。但是您可以创建两个应用程序 - 一个是简单的命令行应用程序,另一个是使用-mwindows. 后者可以调用第一个。第一个退出后,第二个将继续执行。

请注意,这会让用户感到困惑,因为在他看来您的应用程序已停止(因为控制台窗口已关闭)并且已-mwindow编译的应用程序不会创建任何 GUI 元素。

于 2012-08-02T08:26:47.100 回答
1

您可以使用 WinAPI 函数ShowWindow隐藏和显示任何窗口。然而,有一个怪癖 - 此函数接受 HWND 句柄作为其参数,并且没有明显的方法来获取控制台 HWND。以下是获得它的非常复杂的方法:

HWND GetConsoleHwnd(void)
{
#define MY_BUFSIZE 1024 // Buffer size for console window titles.
    HWND hwndFound;         // This is what is returned to the caller.
    TCHAR pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
    // WindowTitle.
    TCHAR pszOldWindowTitle[MY_BUFSIZE]; // Contains original
    // WindowTitle.

    // Fetch current window title.

    GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);

    // Format a "unique" NewWindowTitle.
    TCHAR * format=_TEXT("%d/%d");
    wsprintf(pszNewWindowTitle,format,
            GetTickCount(),
            GetCurrentProcessId());

    // Change current window title.

    SetConsoleTitle(pszNewWindowTitle);

    // Ensure window title has been updated.

    Sleep(40);

    // Look for NewWindowTitle.

    hwndFound=FindWindow(NULL, pszNewWindowTitle);

    // Restore original window title.

    SetConsoleTitle(pszOldWindowTitle);

    return(hwndFound);
}

Forgive me for this dirty trick, but it works perfectly in my code and is an official way of getting console HWND.

于 2013-10-26T15:43:18.423 回答