3

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

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”运行,因此命令不会等到关闭该窗口,并同时运行两者。

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

4

2 回答 2

1

您正在运行的文件称为控制面板文件。传统的,比如mmsys.cpl托管在一个名为rundll32.exe 您可以使用以下方法轮询这些进程列表的进程中:

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

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

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

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

于 2013-07-06T21:03:48.770 回答
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

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

于 2013-07-06T20:44:44.607 回答