【问题标题】:How to execute child console programs without showing the console window from the Win32 GUI program?如何在不显示 Win32 GUI 程序的控制台窗口的情况下执行子控制台程序?
【发布时间】:2011-06-12 05:29:19
【问题描述】:

(我搜索了 SO 答案,但没有找到明确的解决方案。)

我正在开发一个 MFC GUI 程序。该程序运行各种子程序,包括控制台程序和shell命令脚本(.cmd)。

最初它显示一个 GUI 窗口和一个控制台窗口(使用 AllocConsole 创建),因为子进程有很多控制台输出。但是很多用户抱怨控制台窗口,所以我们决定隐藏控制台窗口。

首先尝试如下:

if (AllocConsole())
{
    ::ShowWindow(::GetConsoleWindow(), SW_HIDE);
}

好的,没有控制台窗口,但在控制台创建时有可见的闪烁。 我已经尝试了几个 CreateProcess 子进程创建选项,以完全阻止控制台窗口的显示,但总之失败了,我认为这实际上是不可能的。

这没什么大不了的。我们可以忽略启动时的临时窗口闪烁。

但是真的不能完全隐藏子控制台窗口吗?

【问题讨论】:

  • 闪烁是预期的;您正在创建一个控制台窗口,然后将其隐藏。问题是,如果您不想让用户看到它,为什么还要创建一个控制台窗口? ShellExecuteCreateProcess 有什么问题?
  • @Code Gray 这个程序 CreateProcess 各种控制台程序。没有 AllocConsole,分离的、不可控的控制台窗口会一直被创建、销毁。
  • 我不知道这意味着什么。您正在运行多个不同的控制台程序,如果您每次使用CreateProcess 会创建一个新的控制台窗口而不是重用旧的控制台窗口?所以啊?这有什么问题?
  • @Code Gray 你最好重读一下标题。我想在不显示控制台窗口的情况下执行子控制台程序。
  • 问题是,我不知道什么是“子控制台程序”。我仔细阅读了标题,然后又看了一遍。您只是在问如何使子控制台窗口不可见。如果用户不需要能够与在该控制台窗口中运行的程序进行交互(您的问题表明您最初认为是这种情况,但后来改变了),我质疑您为什么需要该窗口你的设计)。仍然完全不清楚为什么您正在运行的这些控制台应用程序都需要从 same 控制台窗口启动。

标签: c++ c windows mfc console-application


【解决方案1】:

像这样为 CreateProcess 调用设置 STARTUPINFO:

    STARTUPINFO si = { 0 };
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    si.hStdOutput =  GetStdHandle(STD_OUTPUT_HANDLE);
    si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    si.wShowWindow = SW_HIDE;

【讨论】:

  • 谢谢!当使用带有 CREATE_NO_WINDOW 选项的 CreateProcess 时,它可以完美运行。
  • @Cody Gray:问题在于CreateProcess 本身是不够的,而不是它错了。还需要 I/O 重定向和 CREATE_NO_WINDOW 标志。
  • C# 中使用ProcessStartInfo 并设置WindowStyle = ProcessWindowStyle.Hidden。 .NET Frameworked 几乎相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多