等到过程结束

时间:2013-07-06 16:52:58

标签: c# process

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

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”运行,所以命令不会等到关闭那个窗口,并运行它们马上。

有什么办法让我想要吗?

2 个答案:

答案 0 :(得分:1)

您正在投放的内容称为control panel files。像mmsys.cpl这样的旧版本托管在名为rundll32.exe的处理过程中。您可以使用以下方法轮询这些流程的列表:

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

并在这些WaitForExit个对象上调用Process。对于较新的基于mmc.exe的.CPL,您也可以这样做。

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

其他更复杂的解决方案可能涉及使用pinvoke调用Win32函数EnumWindows来获取顶级窗口列表并挂钩它们以观察WM_CLOSE消息。

答案 1 :(得分:0)

好像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运行的,所以我可以检查一下这个过程。

但仍然不知道如何打开设备管理器。 我找到了2个命令:

  • devmgmt.msc
  • hdwwiz.cpl

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

相关问题