头文件如下:
#define UseConsoleInGUI
#ifdef UseConsoleInGUI
class CS_Console
{
public:
HANDLE hConsole;
void open()
{
if(!hConsole)
{
AllocConsole();
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE|BACKGROUND_INTENSITY);
SetConsoleMode(hConsole, ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT);
}
}
void close()
{
FreeConsole();
}
void printf(char *fmt, ...)
{
char s[256] = {0};
va_list argptr;
int cnt;
DWORD cCharsWritten;
va_start(argptr, fmt);
cnt = vsprintf(s, fmt, argptr);
va_end(argptr);
if(hConsole)
{
WriteConsole(hConsole, s, strlen(s), &cCharsWritten, NULL);
}
}
CS_Console &operator<<(const char * const s)
{
if(hConsole)
{
DWORD cCharsWritten;
WriteConsole(hConsole, s, strlen(s), &cCharsWritten, NULL);
}
return *this;
}
public:
CS_Console()
:hConsole(NULL)
{
open();
}
~CS_Console()
{
if(hConsole)
close();
}
};
namespace sword
{
extern CS_Console cout;
}
#endif
cpp代码如下
#ifdef UseConsoleInGUI
namespace sword
{
CS_Console cout;
}
#endif
使用示例:
sword::cout << "hello world!\n";
另一个较复杂的版本,2006年的:
头文件
class ConsoleControl
{
public:
static void Output(char *fmt, ...);
static BOOL PackCmd(LPCTSTR cmd, INPUT_RECORD** output, DWORD nSize);
static void Op_DebugCmd(CString data);
static void CreateConsole();
static void CloseConsole();
private:
static HANDLE m_hConsole;
private:
ConsoleControl(){}
~ConsoleControl(){}
};
cpp文件
#include "ConsoleControl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
HANDLE ConsoleControl::m_hConsole = NULL;
//Debug command打包送往stdin,支持回车
BOOL ConsoleControl::PackCmd(LPCTSTR cmd, INPUT_RECORD** output, DWORD nSize)
{
DWORD i=0;
char ch=0;
if (!cmd || !output) return FALSE;
for(i=0;i<nSize;i++)
{
ch = *(cmd+i);
if (ch == '\n')
{
(*output)[i].EventType = KEY_EVENT;
(*output)[i].Event.KeyEvent.bKeyDown = TRUE;
(*output)[i].Event.KeyEvent.wRepeatCount=1;
(*output)[i].Event.KeyEvent.uChar.AsciiChar = 0x0d;
}else
{
(*output)[i].EventType = KEY_EVENT;
(*output)[i].Event.KeyEvent.bKeyDown = TRUE;
(*output)[i].Event.KeyEvent.wRepeatCount=1;
(*output)[i].Event.KeyEvent.uChar.AsciiChar = ch;
}
}
return TRUE;
}
void ConsoleControl::Op_DebugCmd(CString data)
{
HANDLE hdl;
DWORD num=(DWORD)strlen(data)+1;
DWORD rslt=0;
INPUT_RECORD* input = new INPUT_RECORD[num];
hdl = GetStdHandle(STD_INPUT_HANDLE);
SetConsoleMode(hdl,ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT);
PackCmd(data+"\n", &input, num);
WriteConsoleInput(hdl, input, num, &rslt);
Sleep(500);
delete[] input;
}
void ConsoleControl::CreateConsole()
{
AllocConsole();
m_hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(m_hConsole, FOREGROUND_BLUE|BACKGROUND_INTENSITY);
SetConsoleMode(m_hConsole, ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT);
}
void ConsoleControl::CloseConsole()
{
FreeConsole();
}
void ConsoleControl::Output(char *fmt, ...)
{
char s[300]="";
va_list argptr;
int cnt;
DWORD cCharsWritten;
va_start(argptr, fmt);
cnt = vsprintf(s, fmt, argptr);
va_end(argptr);
if(m_hConsole)
{
WriteConsole(m_hConsole, s, strlen(s), &cCharsWritten, NULL);
}
}