您好我必须编写程序,必须打开一些系统属性,如:
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”运行,所以命令不会等到关闭那个窗口,并运行它们马上。
有什么办法让我想要吗?
答案 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个命令:
但是都运行并创建了我无法跟踪的第二个过程。有什么解决方案吗?