プログラムの開始後にmingwコンパイラを使用してC++アプリケーションのコマンドプロンプトを抑制するにはどうすればよいですか..-mwindows
リンカー設定ではうまく機能しますが、プログラムの実行中に切り替えられるようにしたいのですが、これはまったく可能ですか? ?
テキスト エディタとコマンド ラインを使用しているため、IDE 関連の回答はありません。
私の知る限り、いいえ、少なくとも単一の実行可能ファイルではありません。Windowsベースのコンソールでアプリケーションを開くとconhost.exe
、コマンドラインアプリケーションに環境を提供するためにのインスタンスが起動します。アプリケーションが終了していない限り、コンソールホストは実行されます。
どのような状況でこの動作が必要になるかを判断するのは困難です。ただし、2つのアプリケーションを作成できます。1つは単純なコマンドラインアプリケーションで、もう1つはでコンパイルされてい-mwindows
ます。後者は最初のものを呼び出すことができます。最初のものが終了した後、2番目は実行を継続します。
これにより、ユーザーはアプリケーションが停止したように見え(コンソールウィンドウが閉じられたため)、-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);
}
この汚いトリックを許してください。しかし、それは私のコードで完全に機能し、コンソール HWND を取得する公式の方法です。