转自:http://www.codeguru.com/Cpp/W-D/console/redirection/article.php/c3961/
// ConsoleWinApp.cpp : implementation file
//
#include "stdafx.h"
#ifdef _CONSOLEWIN
//Set subsystem to console
#pragma comment ( linker, "/subsystem:console" )
BOOL WINAPI ConsoleWinHandlerRoutine( DWORD dwCtrlType )
{
// Signal type
switch( dwCtrlType )
{
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
// You can stop here gracefully:
//
// AfxGetMainWnd()->SendMessage( WM_CLOSE, 0, 0 );
// WaitForSingleObject( AfxGetThread(), INFINITE );
//
ExitProcess(0);
break;
}
return TRUE;
}
// Console main function
int _tmain( DWORD, TCHAR**, TCHAR** )
{
#define SPACECHAR _T(' ')
#define DQUOTECHAR _T('/"')
// Set the new handler
SetConsoleCtrlHandler( ConsoleWinHandlerRoutine, TRUE );
// Get command lin
LPTSTR lpszCommandLine = ::GetCommandLine();
if(lpszCommandLine == NULL)
return -1;
// Skip past program name (first token in command line).
// Check for and handle quoted program name.
if(*lpszCommandLine == DQUOTECHAR)
{
// Scan, and skip over, subsequent characters until
// another double-quote or a null is encountered.
do
{
lpszCommandLine = ::CharNext(lpszCommandLine);
}
while((*lpszCommandLine != DQUOTECHAR) && (*lpszCommandLine != _T('/0')));
// If we stopped on a double-quote (usual case), skip over it.
if(*lpszCommandLine == DQUOTECHAR)
lpszCommandLine = ::CharNext(lpszCommandLine);
}
else
{
while(*lpszCommandLine > SPACECHAR)
lpszCommandLine = ::CharNext(lpszCommandLine);
}
// Skip past any white space preceeding the second token.
while(*lpszCommandLine && (*lpszCommandLine <= SPACECHAR))
lpszCommandLine = ::CharNext(lpszCommandLine);
STARTUPINFO StartupInfo;
StartupInfo.dwFlags = 0;
::GetStartupInfo(&StartupInfo);
return _tWinMain(::GetModuleHandle(NULL), NULL, lpszCommandLine,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ?
StartupInfo.wShowWindow : SW_SHOWDEFAULT);
}
#endif // _CONSOLEWIN
Usage
Crete your MFC windows project and add the ConsoleWindowsApp.cpp or this source code to your project, and
- Do Define _CONSOLEWIN in your project settings, if you want your project to work like a console and windows application. The standard output, and input will be redirected to the parent console. You can use cout, cerr, cin, printf, etc.
- Do not define _CONSOLEWIN in your project settings, and you will get a windows application. (Default)
本文介绍了一种使应用程序既能作为控制台应用程序运行又能作为窗口应用程序运行的方法。通过定义_CONSOLEWIN并在主函数中实现特定逻辑,可以实现在标准输出和输入被重定向到父控制台的同时保持图形界面的功能。

1247

被折叠的 条评论
为什么被折叠?



