本文描述如何在GUI程序中调出控制台窗口,以及对控制台的一些操作。
大家都知道GUI程序默认是没有控制台窗口的,我们可以调用windows API 来创建控制台。之后我们就可以使用 printf,scanf,cout,cin之类控制台的输入输出函数。我们很容易在GUI程序中使用控制台窗口输出调试信息。
1. 创建控制台
<span style="font-size:18px;">BOOL AllocConsole(void);</span>
2. 重定向标准输入输出 。创建控制台后,使用 cout 语句输出的内容并不会在我们创建的控制台窗口中显示出来。我们需要把标准输出重定向到控制台。
<span style="font-size:18px;">freopen("CONOUT$","w",stdout);
freopen("CONIN$","r",stdin);</span>
3. 设置控制台窗口标题
<span style="font-size:18px;">BOOL SetConsoleTitle(LPCTSTR lpConsoleTitle);</span>
4. 清空控制台内容
<span style="font-size:18px;">COORD coordScreen = { 0, 0 };
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD dwConSize;
HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
GetConsoleScreenBufferInfo( hConsole, &csbi );
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter( hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten );
SetConsoleCursorPosition( hConsole, coordScreen );</span>
5. Disable 控制台窗口的关闭按钮。如果关闭了控制台窗口,GUI程序也会被关闭,我们可以Disable这个关闭按钮。
<span style="font-size:18px;">typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();
PROCGETCONSOLEWINDOW GetConsoleWindow;
HMODULE hKernel32 = GetModuleHandle("kernel32");
GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
HWND hConsole = GetConsoleWindow();
::RemoveMenu(::GetSystemMenu(hConsole,FALSE),SC_CLOSE,MF_BYCOMMAND);</span>
6. 设置控制台输出文本foreground 和 background的颜色
<span style="font-size:18px;">WORD dwAttributes;
dwAttributes = FOREGROUND_GREEN|FOREGROUND_INTENSITY;// 文本颜色:绿色高亮。背景颜色:默认黑色。
SetTextAttribute(dwAttributes);</span>
7.销毁控制台
Void FreeConsole();