我试图使用C#重新编写Windows命令提示符。我想知道命令提示符是如何知道何时等待启动的进程退出,以及何时不等待被调用的进程退出。
例如,如果在命令提示符中输入“notepad”,记事本将启动,但您仍然可以执行其他命令。但是,如果您打开像more.com、ping.exe或另一个实用程序,则它将在让您执行另一个命令之前等待正在执行的程序完成。
命令提示符是如何知道何时等待退出,并且如何在C#中模拟这种行为?
我试图使用C#重新编写Windows命令提示符。我想知道命令提示符是如何知道何时等待启动的进程退出,以及何时不等待被调用的进程退出。
例如,如果在命令提示符中输入“notepad”,记事本将启动,但您仍然可以执行其他命令。但是,如果您打开像more.com、ping.exe或另一个实用程序,则它将在让您执行另一个命令之前等待正在执行的程序完成。
命令提示符是如何知道何时等待退出,并且如何在C#中模拟这种行为?
如果应用程序是Win32 GUI应用程序,则它将直接运行,命令提示符不会等待其退出。
如果应用程序是控制台应用程序,则它将在命令提示符中运行,您需要等待它完成才能获得命令提示符返回。
编辑:
好的。看来您需要技术解释。如果您想在应用程序中模拟相同的特性,可以在此处检查EXE文件的IMAGE_OPTIONAL_HEADER
。 这里。
在IMAGE_OPTIONAL_HEADER
内部有:
WORD Subsystem;
If SubSystem == 0x02
表示它是一个 GUI 应用程序。
If SubSystem == 0x03
表示它是一个命令提示符应用程序。
编辑2:
如果您想看到它的实际效果:
将 calc.exe 或 notepad.exe 复制到桌面上
在 CFF Explorer 中打开复制的 calc.exe
导航到“Nt Headers”->“Optional Headers”
将 SubSystem 从 0x002 更改为 0x003
保存它
现在运行新修改的 calc,您将看到命令提示符等待它被终止。
默认情况下,命令提示符会将GUI程序分离到一个单独的进程/分支中运行。然而,你可以在命令提示符/Shell脚本中直接运行记事本(或其他GUI程序):
start /w notepad.exe
notepad
只是启动记事本应用程序并离开应用程序的控制。而命令 ipconfig
在提示符的域(不是应用程序域)下运行。Process.Start
时,不要等待。它无论如何都不会等待。