C++ C++;:向打开窗体的控制台写入
我有一个可以打开窗口的控制台。如何使用从窗体上的控件获取的值写入此控制台?例如,文本字段?默认情况下,windows控制台应用程序已将标准输出连接到控制台。如果没有(例如,i/o被shell重定向),您可以打开特殊文件名“CONOUT$”来访问windows下的控制台,您必须将程序链接为控制台应用程序。在VisualC++中,可以在配置属性/链接器/系统/子系统=控制台下的项目设置中配置该项。 将应用程序链接为concole应用程序并不意味着无法打开窗口。这只意味着a)您的进程将始终有一个控制台窗口,b)例如cmd.exe将同步执行它(=等待它完成后再继续脚本/再次显示提示) 然后您可以使用通常的方式访问控制台:使用C++ C++;:向打开窗体的控制台写入,c++,winforms,console,C++,Winforms,Console,我有一个可以打开窗口的控制台。如何使用从窗体上的控件获取的值写入此控制台?例如,文本字段?默认情况下,windows控制台应用程序已将标准输出连接到控制台。如果没有(例如,i/o被shell重定向),您可以打开特殊文件名“CONOUT$”来访问windows下的控制台,您必须将程序链接为控制台应用程序。在VisualC++中,可以在配置属性/链接器/系统/子系统=控制台下的项目设置中配置该项。 将应用程序链接为concole应用程序并不意味着无法打开窗口。这只意味着a)您的进程将始终有一个控制台
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秒钟通常很有用;)