![](/img/trans.png)
[英]How to display Visual Studio Console Application output inside the IDE and not in command prompt?
[英]How to get console output data into command prompt?
我有一个基于Windows的应用程序。 我使它可以同时在GUI Mode
和Console Mode
。 在GUI mode
或Console 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.