等待进程结束

本文关键字:结束 进程 等待 | 更新日期: 2023-09-27 18:21:31

你好,我必须编写程序,必须打开一些系统属性,如:

Process sound = new Process();
sound.StartInfo.FileName = "mmsys.cpl";
sound.Start();
// Place 1
Process device = new Process();
device.StartInfo.FileName = "hdwwiz.cpl";
device.Start();
// Place 2
// Other Code doing sth

这很好,但我的问题是,我必须首先运行mmsys.cpl,等待用户检查他必须做什么,然后在关闭窗口后运行hdwwiz.cpl。

因此,在// Place 1中,我写道:

sound.WaitForExit();

但这不起作用,因为mmsys.cpl只是快捷方式,以进程"explorer.exe"运行,而hdwwiz.cpl以"mmc.exe"运行。

有什么办法使某事像我想要的那样吗?

等待进程结束

您正在运行的文件称为控制面板文件。像mmsys.cpl这样的遗留进程托管在名为rundll32.exe的已处理进程中。您可以使用以下方法轮询这些进程的列表:

Process[] processes = Process.GetProcessessByName("rundll32.exe");

并在这些CCD_ 5对象上调用CCD_。您可以对基于较新mmc.exe的.CPL的执行相同操作

显然,如果同时运行多个控制面板小程序,这不是一个好的解决方案。在这种情况下,您可能会向用户发出警告,关闭其他窗口。

其他更复杂的解决方案可能包括使用pinvoke调用Win32函数EnumWindows,以获得顶级窗口的列表,并挂起它们来监视WM_CLOSE消息。

对于mmsys.cpl这样的属性,解决方案是:

Process sound = new Process();
sound.StartInfo.FileName = "rundll32.exe";
sound.StartInfo.Arguments = "shell32.dll,Control_RunDLL mmsys.cpl";
sound.Start();
sound.WaitForExit();

因为windows是通过rundll32命令而不是explorer.exe运行的,所以我可以检查该进程。

但仍然不知道如何打开设备管理器。我发现了两个命令:

  • devmgmt.msc
  • hdwwiz.cpl

但两者都运行并创建了我无法跟踪的第二个进程。有什么解决方案吗?