C++ 如何隐藏给定PID的进程控制台?

C++ 如何隐藏给定PID的进程控制台?,c++,windows,qt,console,win32-process,C++,Windows,Qt,Console,Win32 Process,我想在单击Qt应用程序上的按钮时启动一个进程。 我用QProcess::startDetached(…,qint64*pid)()创建了一个进程,但我有一个控制台想要隐藏 如何隐藏它?我必须在流程之外使用哪个函数 此代码不会隐藏进程的控制台(在win32中): 如果可以重新编译正在启动的程序,则可以将其设置为Windows而不是控制台程序(在MSVC中,这是在项目链接器->系统,设置中,您需要/SUBSYSTEM:Windows) 否则,QTstart方法显然不会创建控制台窗口,而started

我想在单击Qt应用程序上的按钮时启动一个进程。 我用
QProcess::startDetached(…,qint64*pid)
()创建了一个进程,但我有一个控制台想要隐藏

如何隐藏它?我必须在流程之外使用哪个函数

此代码不会隐藏进程的控制台(在win32中):


如果可以重新编译正在启动的程序,则可以将其设置为Windows而不是控制台程序(在MSVC中,这是在项目链接器->系统,设置中,您需要
/SUBSYSTEM:Windows

否则,QT
start
方法显然不会创建控制台窗口,而
starteddetached
会创建控制台窗口,因此您可以根据自己的使用情况使用
start


或者,
CreateProcess
的标志将阻止自动控制台,quote MSDN:

该进程是在没有控制台窗口的情况下运行的控制台应用程序。因此,未设置应用程序的控制台句柄

不幸的是,QT似乎没有提供任何方法来创建或使用带有本机标志的
QProcess
,或者从本机句柄创建或使用它的
QProcess(例如no
QProcess(CreateProcess(…)
),尽管它在几年前被建议并被拒绝


因此,您要么只需使用Microsoft API,要么找到另一个用于多进程工作的库。

如果您可以重新编译正在启动的程序,则可以将其设置为Windows程序,而不是控制台程序(在MSVC中,这是在项目链接器->系统,设置中,您需要
/SUBSYSTEM:Windows

否则,QT
start
方法显然不会创建控制台窗口,而
starteddetached
会创建控制台窗口,因此您可以根据自己的使用情况使用
start


或者,
CreateProcess
的标志将阻止自动控制台,quote MSDN:

该进程是在没有控制台窗口的情况下运行的控制台应用程序。因此,未设置应用程序的控制台句柄

不幸的是,QT似乎没有提供任何方法来创建或使用带有本机标志的
QProcess
,或者从本机句柄创建或使用它的
QProcess(例如no
QProcess(CreateProcess(…)
),尽管它在几年前被建议并被拒绝


因此,您要么只需使用Microsoft API,要么找到另一个用于多进程工作的库。

CREATE\u NO\u WINDOW
是使用
STARTUPINFO
创建隐藏控制台窗口的替代方法。它创建一个新的控制台(即conhost.exe实例),进程标准句柄设置为控制台输入和屏幕缓冲区,进程的控制台句柄引用新控制台,因此控制台功能正常工作。只是控制台没有创建窗口,所以
GetConsoleWindow
返回
NULL
。使用
CREATE_NEW_CONSOLE
和隐式使用后者的任何函数(如
CreateProcessWithLogonW
CreateProcessWithTokenW
)忽略此标志。是否直接记录在任何地方?。文档仅对“GUI进程”进行了说明。然而,“对于GUI进程,第一次调用`ShowWindow`时,忽略其
nCmdShow
参数
wShowWindow
指定默认值”,但由于“对于控制台进程,如果为进程创建新控制台,此信息会影响控制台窗口。”我猜它是传递给控制台主机的,并且定义良好,行为略有不同。如果子进程创建新控制台,即与
创建新控制台
组合使用
STARTUPINFO
应该始终有效。窗口只是隐藏的,所以应用程序可以获得它的句柄并显示它。
CREATE\u NO\u窗口
方法隐式地创建了一个新的控制台,并且没有任何窗口可以显示。至于文档,我不知道作者说“因此,应用程序的控制台句柄未设置”之类的话会有多大意义,这要么是错误的,要么是非常糟糕的陈述。
CREATE\u NO\u WINDOW
是使用
STARTUPINFO
创建隐藏控制台窗口的替代方法。它创建一个新的控制台(即conhost.exe实例),进程标准句柄设置为控制台输入和屏幕缓冲区,进程的控制台句柄引用新控制台,因此控制台功能正常工作。只是控制台没有创建窗口,所以
GetConsoleWindow
返回
NULL
。使用
CREATE_NEW_CONSOLE
和隐式使用后者的任何函数(如
CreateProcessWithLogonW
CreateProcessWithTokenW
)忽略此标志。是否直接记录在任何地方?。文档仅对“GUI进程”进行了说明。然而,“对于GUI进程,第一次调用`ShowWindow`时,忽略其
nCmdShow
参数
wShowWindow
指定默认值”,但由于“对于控制台进程,如果为进程创建新控制台,此信息会影响控制台窗口。”我猜它是传递给控制台主机的,并且定义良好,行为略有不同。如果子进程创建新控制台,即与
创建新控制台
组合使用
STARTUPINFO
应该始终有效。窗口只是隐藏的,所以应用程序可以获得它的句柄并显示它。
CREATE\u NO\u窗口
方法隐式地创建了一个新的控制台,并且没有任何窗口可以显示。至于文档,我不知道作者说“因此,应用程序的控制台句柄没有设置”这样的话会有多大意义,这要么是错误的,要么是非常糟糕的陈述。
if (AttachConsole((DWORD)m_PID))
{
    FreeConsole();
}