在MFC中加一个控制台DOS界面 |
//****************************************************************//
如下,如是对话框程序的话,只要把我这段代码拷贝到OnInitDialog中就可以了,当然ConsoleHandler是全局的了.如果是文档程序的话,C**App::InitInstance中就OK。BOOL CMFCAPPDlg::OnInitDialog(){ //**************************************// BOOL bTest = AllocConsole(); if(!bTest) { ::MessageBox(NULL,"ERROR AllocConsole",TEXT(""),MB_OK); } AllocConsole(); // you only get 1 console. DWORD astds[3]={STD_OUTPUT_HANDLE,STD_ERROR_HANDLE,STD_INPUT_HANDLE}; FILE *atrgs[3]={stdout,stderr,stdin}; for( register int i=0; i<3; i++ ) { long hand=(long)GetStdHandle(astds[i]); if( hand!=(long)INVALID_HANDLE_VALUE ) { int osf=_open_osfhandle(hand,_O_TEXT); if( osf!=-1 ) { FILE *fp=_fdopen(osf,(astds[i]==STD_INPUT_HANDLE) ? "r" : "w"); if( fp!=NULL ) { *(atrgs[i])=*fp; setvbuf(fp,NULL,_IONBF,0); } } }
SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler, TRUE); }
ConsoleHandler控制台界面接收事件的用的。比如说CTRL + C,此时,这个回调函数就会得到此消息,你就可以在这里进行相关的处理了。这很好用的,特别是有时候你调试时候,想要拥有WIN32 Consele下的那种命令操作符:
BOOL WINAPI ConsoleHandler(DWORD CEvent)
{ switch(CEvent) { case CTRL_C_EVENT: MessageBox(NULL,"CTRL + C received!", "signal", MB_OK); break; case CTRL_BREAK_EVENT: MessageBox(NULL,"CTRL+BREAK received!", "signal", MB_OK); break; case CTRL_CLOSE_EVENT: MessageBox(NULL,"Program being closed!", "signal", MB_OK); break; case CTRL_LOGOFF_EVENT: MessageBox(NULL, "User is logging off!", "signal", MB_OK); break; case CTRL_SHUTDOWN_EVENT: MessageBox(NULL,"User is logging off!", "signal", MB_OK); break; } return TRUE;} // Main message loop: //**************************************//
}
最后说一下,ConsoleHandler应该拿到最上面去,不然,会报错的。 | |
|
|