如何将控制台输出数据导入命令提示符?

时间:2013-10-09 07:34:42

标签: c++ visual-studio-2010 visual-c++ mfc console

我有一个基于Windows的应用程序。我让它适用于GUI ModeConsole Mode。在GUI modeConsole mode我使用Console附加AttachConsole()以将输出打印语句调出到控制台。现在面临的挑战是,当我在console modeCommand prompt中使用时,我不需要新的控制台。 假设从命令提示符开始,我将其作为

运行

d:\Project path > MyApp.exe consolemode **Enter**

然后它会调出另一个控制台,因为Attachconsole()。现在,当我禁用AttachConsole()时,它不会启动新控制台,也不会在命令提示符中显示输出。但我的要求是在commandprompt中显示输出,而不是在从comamnd提示符执行时启动新控制台。

Myapp.cpp
Winmain()
{
....
...
AttachConsole();
cout << "Console Attached \n";
// Some more output
}

所以,当我从命令promt运行myapp.exed:\Project path > MyApp.exe consolemode **Enter** 它附加一个new console并在新的控制台窗口中打印输出。现在我的要求是我需要禁用AttachConsole();并希望在命令提示符下看到输出。

Myapp.cpp
Winmain()
{
....
...
//AttachConsole(); //Now I an disabling console
cout << "Console Attached \n";
// Some more output
}

如果您查看上面的代码,我已禁用AttachConsole()。现在我想要,

d:\Project path > MyApp.exe consolemode **Enter** 输出将出现在comamnd提示符下。如下所示

d:\Project path > MyApp.exe consolemode **Enter**
Console Attached
....
...
d:\Project path >

请帮帮我

2 个答案:

答案 0 :(得分:1)

您应该使用当前运行窗口的句柄并对其进行处理,以便您不需要allocconsole。此外,您必须找到光标所在的位置,并指定您的输出应该写在那里。

HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbi; 

void cp( HANDLE hConsole,wchar_t* output )
{


    DWORD cCharsWritten; 
    COORD  crCurr;
    GetConsoleScreenBufferInfo(hStdout, &csbi);
    crCurr = csbi.dwCursorPosition;

    std::wstring ss;
    ss=output;

    if( !WriteConsoleOutputCharacter( hConsole,       
                                ss.c_str(),     
                                (DWORD)ss.length(), 
                                crCurr,     
                                &cCharsWritten ))
    {
      return;
    }

}

int main( void )
{

    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hStdout, &csbi);

    function(hStdout,L"string");
    return 0;
}

答案 1 :(得分:0)

一个进程只能有一个控制台。因此,如果已经存在控制台,则AllocConsole将失败,但如果您尚未连接到父进程的控制台,则AttachConsole将成功。如果从命令提示符运行,则您将已连接到父控制台,该控制台将为cmd.exe,而AttachConsole也将失败(除非您先调用FreeConsole)。如果没有控制台(“GUI模式”),则AllocConsole将成功(如果您知道具有可附加的控制台的进程的PID并且您具有足够的访问权限,那么AttachConsole也将成功)。所以你只需要先尝试分配,如果失败然后调用AttachConsole(-1),如果失败则调用AllocConsole(或FreeConsole然后是AttachConsole)。注意:如果通过AllocConsole创建控制台,则不必同时调用AttachConsole(AttachConsole仅用于连接到不同的控制台,通常是不同进程的控制台)。

如果您不想在“控制台模式”中使用cmd.exe控制台,则可以调用FreeConsole(在通过查看AllocConsole失败确定已存在控制台之后),然后AllocConsole将成功。此FreeConsole不会影响父进程的控制台。

如果要使用标准输出函数(如printf或cout)写入使用AllocConsole分配的控制台,或者使用scanf在“GUI”模式下运行时从控制台读取,则必须按如下方式显式设置标准句柄:

    freopen("CON", "w", stdout);
    freopen("CON", "w", stderr);
    freopen("CON", "r", stdin);

不久前,我写了一篇关于如何做到这一点的博客文章。我发现发布链接是不受欢迎的,但我认为你会发现它很有用。您可以下载完整的示例应用程序的Visual Studio解决方案:http://www.windowsinspired.com/how-to-add-a-debugging-console-to-a-windows-gui-application/