2011-01-20 131 views
11

(我搜索了答案,发现没有明确的解决方案来解决这个问题。)如何在不显示Win32 GUI程序的控制台窗口的情况下执行子控制台程序?

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

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

首先试图象下面这样:

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

好吧,没有控制台窗口,但也有在控制台创建时可见闪烁。 我试过子进程创建几个CreateProcess选项,以完全防止控制台窗口中的表现,但在短暂失败,我认为这几乎是不可能的。

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

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

+1

闪烁预期;你正在创建一个控制台窗口,然后隐藏它。问题是,如果你不想让用户看到它,为什么你会创建一个控制台窗口? `ShellExecute`或`CreateProcess`有什么问题? – 2011-01-20 04:58:17

+2

@Code Grey这个程序CreateProcess各种控制台程序。如果没有AllocConsole,将会创建分离且无法控制的控制台窗口,并一直销毁。 – 9dan 2011-01-20 05:07:30

回答

15

设置的STARTUPINFO喜欢本作的CreateProcess的呼叫:

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; 
相关问题