繁体   English   中英

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

[英]How to get console output data into command prompt?

我有一个基于Windows的应用程序。 我使它可以同时在GUI ModeConsole Mode GUI modeConsole mode我通过使用AttachConsole()Console的输出打印语句附加到控制台。 现在的挑战是,在console mode或从Command prompt console mode使用它时,不需要新的控制台。 假设从命令提示符下运行

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

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

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

因此,当我从命令promt d:\\Project path > MyApp.exe consolemode **Enter**运行myapp.exe ,它将附加一个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**输出将以d:\\Project path > MyApp.exe consolemode提示。 像下面

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

请帮我

您应该处理当前正在运行的窗口并对其进行处理,以使您不需要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;
}

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

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

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

    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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM