Александр Пузанов Asked:2020-12-21 21:01:03 +0000 UTC2020-12-21 21:01:03 +0000 UTC 2020-12-21 21:01:03 +0000 UTC 如何从 Windows 窗体应用程序向控制台打印消息? 772 可以使用参数启动应用程序。需要在启动应用程序的同一控制台中显示参数帮助,假设用户犯了错误。启动应用程序时如何在同一控制台中显示消息? c# 2 个回答 Voted Best Answer default locale 2020-12-21T21:59:51Z2020-12-21T21:59:51Z 问题是它cmd.exe不处理 GUI 应用程序的输出。在启动时,shell 检查可执行文件头中的标志,如果应用程序是窗口化的,那么它会在不阻塞控制台的情况下启动。之后,您可以启动另一个应用程序、执行命令或完全关闭控制台窗口。因此,如果在控制台中显示该消息之后,将不清楚它们来自哪个进程。 我建议考虑替代方案: 在 GUI 中显示错误消息。由于整个应用程序是窗口化的,那么在界面中显示消息是合乎逻辑的。 使用 Win32,通过以下方式将控制台输出附加到父进程AttachConsole并强制写入: //импорт функции [DllImport("kernel32.dll")] static extern bool AttachConsole(int dwProcessId); //присоединяемся к родительскому процессу AttachConsole(-1) //пишем в консоль Console.WriteLine("Some message"); 这看起来很奇怪,尤其是当控制台中正在运行另一个进程时。此外,如果您需要重定向输出流,则必须自己实现。 制作应用程序控制台(更改 Visual Studio 项目设置中的输出类型)。在这种情况下,输出到控制台将起作用。缺点是即使在资源管理器中运行也会出现控制台窗口。控制台可以用 隐藏ShowWindow,但不能完全避免。 nick_n_a 2020-12-21T23:00:41Z2020-12-21T23:00:41Z 或者,您可以创建一个新的控制台AllocConsole //импорт функции [DllImport("kernel32.dll")] static extern bool AllocConsole(); //.... // Присоиденить консоль AllocConsole(); 并在输出之前调用它一次。将创建一个新控制台。(每个进程一个控制台,即如果您从该进程再次调用它,则不会有两个)。 如果您仍然需要写入父控制台,那么您可以像这样连接 AttachConsole 和 AllocConsole [DllImport("kernel32.dll")] static extern bool AttachConsole(int dwProcessId); [DllImport("kernel32.dll")] static extern bool AllocConsole(); // if (!AttachConsole(-1)) AllocConsole (); 但随后可能会出现“冲突”——两个应用程序将写入同一个控制台。但是如果两者都显示“完成”(例如总是以回车结尾)和“简单”(没有屏幕清除颜色等属性)的句子,那么它们可能不会相互干扰。
问题是它
cmd.exe不处理 GUI 应用程序的输出。在启动时,shell 检查可执行文件头中的标志,如果应用程序是窗口化的,那么它会在不阻塞控制台的情况下启动。之后,您可以启动另一个应用程序、执行命令或完全关闭控制台窗口。因此,如果在控制台中显示该消息之后,将不清楚它们来自哪个进程。我建议考虑替代方案:
使用 Win32,通过以下方式将控制台输出附加到父进程
AttachConsole并强制写入:这看起来很奇怪,尤其是当控制台中正在运行另一个进程时。此外,如果您需要重定向输出流,则必须自己实现。
ShowWindow,但不能完全避免。或者,您可以创建一个新的控制台AllocConsole
并在输出之前调用它一次。将创建一个新控制台。(每个进程一个控制台,即如果您从该进程再次调用它,则不会有两个)。
如果您仍然需要写入父控制台,那么您可以像这样连接 AttachConsole 和 AllocConsole
但随后可能会出现“冲突”——两个应用程序将写入同一个控制台。但是如果两者都显示“完成”(例如总是以回车结尾)和“简单”(没有屏幕清除颜色等属性)的句子,那么它们可能不会相互干扰。