如何在程序启动后-mwindows
使用 mingw 编译器抑制 c++ 应用程序的命令提示符。在链接器设置中效果很好,但我希望能够在程序运行时切换它,这可能吗?
我正在使用文本编辑器和命令行,所以请不要与 IDE 相关的答案。
据我所知:不,至少不是一个可执行文件。当您在基于 Windows 的控制台中打开应用程序时,它将启动一个实例,conhost.exe
以便为您的命令行应用程序提供环境。只要您的应用程序尚未退出,控制台主机就会运行。
很难确定在哪些情况下需要这种行为。但是您可以创建两个应用程序 - 一个是简单的命令行应用程序,另一个是使用-mwindows
. 后者可以调用第一个。第一个退出后,第二个将继续执行。
请注意,这会让用户感到困惑,因为在他看来您的应用程序已停止(因为控制台窗口已关闭)并且已-mwindow
编译的应用程序不会创建任何 GUI 元素。
您可以使用 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.