0

我有一个基于 Windows 的应用程序。我让它同时适用于GUI ModeConsole Mode。在GUI mode或者Console modeConsole通过使用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
}

因此,当我运行myapp.exefrom 命令提示符 d:\Project path > MyApp.exe consolemode **Enter** 时,它会附加 anew 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 **Enter**
Console Attached
....
...
d:\Project path >

请帮我

4

2 回答 2

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;
}
于 2014-01-28T06:41:02.230 回答
0

一个进程只能有一个控制台。因此,如果已经有一个控制台,那么 AllocConsole 将失败,但如果您尚未附加到父进程的控制台,则 AttachConsole 将成功。如果您从命令提示符运行,您将已经附加到父控制台,即 cmd.exe,并且 AttachConsole 也会失败(除非您先调用 FreeConsole)。如果没有控制台(“GUI 模式”),那么 AllocConsole 将成功(如果您知道具有可以附加到的控制台的进程的 PID 并且您有足够的访问权限,则 AttachConsole 也会成功)。所以你只需要首先尝试分配,如果失败则调用 AttachConsole(-1),如果失败则调用 AllocConsole(或 FreeConsole 然后 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/

于 2013-10-09T15:01:26.790 回答