我有一个基于Windows的应用程序。我让它适用于GUI Mode
和Console Mode
。在GUI mode
或Console mode
我使用Console
附加AttachConsole()
以将输出打印语句调出到控制台。现在面临的挑战是,当我在console mode
或Command 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.exe
时
d:\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 >
请帮帮我
答案 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/