| 
 
|  在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应该拿到最上面去,不然,会报错的。 |  |  
|  |  
 
 |