2012-02-16 114 views
2

我試圖停止由c#中的cmd.exe啓動的進程。例如,開始記事本; cmd.exe/c記事本。如何殺死由cmd.exe啓動的進程

System.Diagnostics.ProcessStartInfo("cmd.exe", "/c notepad"); 

當我殺死進程cmd.exe停止。但記事本仍然存在。我如何獲得記事本的句柄並停止它?

+0

你需要殺死'notepad.exe'過程中從'cmd.exe'過程分開。如果您手動執行此操作,您將看到相同的行爲。 – 2012-02-16 22:07:17

回答

7

您應該使用一個自定義的方法,列出了在cmd父進程的所有進程

您需要首先添加System.Management參考。

然後簡單地殺死進程樹:

  void Main() 
      { 

       var psi = new ProcessStartInfo("cmd.exe", "/c notepad"); 
       var cmdProcess = Process.Start(psi); 
       Thread.Sleep(2000); 
       KillProcessAndChildren(cmdProcess.Id); 

      } 

      public void KillProcessAndChildren(int pid) 
      { 
      using (var searcher = new ManagementObjectSearcher 
       ("Select * From Win32_Process Where ParentProcessID=" + pid)) 
      { 
       var moc = searcher.Get(); 
       foreach (ManagementObject mo in moc) 
       { 
        KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"])); 
       } 
       try 
       { 
        var proc = Process.GetProcessById(pid); 
        proc.Kill(); 
       } 
       catch (Exception e) 
       { 
        // Process already exited. 
       } 
      } 
      } 
0

您是否考慮直接開始notepad.exe而不是使用cmd.exe

+0

我需要從命令行啓動我的程序。記事本只是一個例子。 – syloc 2012-02-17 05:54:04

0

那麼從命令行您可以使用

的taskkill/MI的cmd.exe/T