Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:向打开窗体的控制台写入_C++_Winforms_Console - Fatal编程技术网

C++ C++;:向打开窗体的控制台写入

C++ C++;:向打开窗体的控制台写入,c++,winforms,console,C++,Winforms,Console,我有一个可以打开窗口的控制台。如何使用从窗体上的控件获取的值写入此控制台?例如,文本字段?默认情况下,windows控制台应用程序已将标准输出连接到控制台。如果没有(例如,i/o被shell重定向),您可以打开特殊文件名“CONOUT$”来访问windows下的控制台,您必须将程序链接为控制台应用程序。在VisualC++中,可以在配置属性/链接器/系统/子系统=控制台下的项目设置中配置该项。 将应用程序链接为concole应用程序并不意味着无法打开窗口。这只意味着a)您的进程将始终有一个控制台

我有一个可以打开窗口的控制台。如何使用从窗体上的控件获取的值写入此控制台?例如,文本字段?

默认情况下,windows控制台应用程序已将标准输出连接到控制台。如果没有(例如,i/o被shell重定向),您可以打开特殊文件名“CONOUT$”

来访问windows下的控制台,您必须将程序链接为控制台应用程序。在VisualC++中,可以在配置属性/链接器/系统/子系统=控制台下的项目设置中配置该项。 将应用程序链接为concole应用程序并不意味着无法打开窗口。这只意味着a)您的进程将始终有一个控制台窗口,b)例如cmd.exe将同步执行它(=等待它完成后再继续脚本/再次显示提示)

然后您可以使用通常的方式访问控制台:使用
std::cout
printf

如果应用程序作为窗口应用程序链接,那么没有(好的和简单的)方法可以访问启动应用程序的控制台。(IIRC您可以分配一个新的控制台,但我认为这不是您想要的)

编辑:如果要将某些消息打印到控制台,即使输出已重定向,我建议您使用
std::cerr
打印到“错误输出”。“错误输出”也默认为控制台,但它是与“标准输出”不同的流,并且通常不会重定向。它可以重定向,但我认为给用户这个选项是一件好事,而不是通过直接打印到控制台来绕过任何重定向


EDIT2:当我需要一个“双模式”应用程序时,即可以使用GUI或命令提示符运行的应用程序,我使用控制台应用程序,如果通过命令行参数选择GUI版本(例如,不传递任何参数),则调用FreeConsole()以摆脱控制台窗口。如果应用程序在GUI模式下启动(例如,在资源管理器中双击),控制台仍然会短暂弹出,但它会立即关闭,以便在使用GUI时不会扰乱屏幕。

您是使用
/clr
编译的吗?使用
c++-cli
标记。这样我就可以使用fprintf并使用CONOUT$作为文件名了?@Alex:是的,你可以
fopen(“CONOUT$”,“w”)
,然后
fprintf
。有
AttachConsole
,但它有一个不希望的副作用,就是不会阻塞大多数shell,因此进程的输出将与父进程混杂在一起。OK,我把帖子改为“没有(好的和简单的)访问控制台的方法……”。顺便问一下:如何获得AttachConsole的正确进程ID?如果我理解正确,就必须获得shell的进程ID,即当前进程的父进程…带有
ATTACH\u parent\u process
标志,在@Ben Voigt:Muaha中清楚地描述了这一点,真令人尴尬!谢谢,也许我应该花3秒钟以上的时间来查看文档:)我发现6或7秒钟通常很有用;)