2013-07-06 66 views
2

你好,我必須寫程序,要打開像一些系統屬性:等到處理結束

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

你所運行的被稱爲control panel files。傳統的,如mmsys.cpl一個名爲處理託管rundll32.exe你可以得到查詢使用這些進程的列表:

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

,並呼籲這些Process對象WaitForExit。您可以對基於.CPL的較新的mmc.exe執行相同操作。

顯然,這是不是如果有在同一時間運行多個控制面板小程序的理想解決方案。在這種情況下,您可能會向用戶發出警告以關閉其他人。

其他更復雜的解決方案可能涉及使用的PInvoke調用Win32函數EnumWindows得到的頂層窗口的列表和鉤他們看爲WM_CLOSE消息。

+0

工作幾乎完美的'mmc',但是當我通過'devmgmt.msc'系統啓動進程運行mmc的一個實例並非常快速地重新啓動到另一個實例與其他pid。我找到了解決方案,通過'hdwwiz.cpl'運行進程,並在回答中提供幫助,等到系統用'mmc'創建進程名稱:)並且正常工作。 _謝謝_ – Maciek

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(); 

因爲窗口是通過RUNDLL32命令不EXPLORER.EXE運行,所以我可以檢查過程。

但仍然不知道如何打開設備管理器。 我發現2個命令:

  • devmgmt.msc
  • hdwwiz.cpl

但兩者運行,並創建第二方法,該方法我不能跟蹤。任何解決方案?