2012-02-21 77 views
3

另一個問題在這裏。 我只想知道是否可以使用C#結束任務這些應用程序。C#結束任務沒有結束進程

喜歡:有4個記事本應用程序已打開。我只想關閉第二個記事本應用程序。但是當我嘗試使用process.Kill時,所有4個記事本都被關閉了。有什麼辦法只關閉指定的註釋?

這裏是我的示例代碼:

foreach (Process p in Process.GetProcesses(".")) 
{ 
    if (p.MainWindowTitle.Length > 0) 
    { 
     if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt") 
     { 
      p.Kill(); 
     } 
    } 
} 
+2

那麼你通過所有的過程和殺戮循環所有有記事本名稱的文本...更改你的算法以殺死第二個,並在完成時離開循環 – MBen 2012-02-21 08:08:15

+0

也許所有的記事本應用程序都有相同的標題?如果可能的話,通過它的ID來終止一個進程總是一個好方法 – Beatles1692 2012-02-21 08:09:45

+0

它只是不斷讓我驚訝,有多少C#程序員試圖自動化記事本。只需在窗體上放置一個編輯控件即可。繁榮,你可以即時控制你自己的記事本。 – 2012-02-21 08:11:34

回答

3

您需要使用過程的開始時間來尋找第二次運行記事本。

Process[] processes = (from prc in Process.GetProcessesByName("notepad") 
         orderby prc.StartTime 
         select prc).ToArray(); 

if (processes.Count() > 1) 
    processes[1].Kill(); 
+4

不能依賴PIDs分配機制。基本上,你應該知道的關於PID的唯一方法是它不會隨着時間而改變,並且在任何給定的時間點都是唯一的。 – penartur 2012-02-21 08:12:07

+0

我並不是要依靠特定的進程ID,而是依賴於它們創建的順序。我已經改寫了我的答案。 – 2012-02-21 08:33:17

+0

如果您沒有使用PID來識別您想要殺死的進程,則不應該真的這樣做,因爲您可能以非預期的方式殺死其他進程。爲什麼你需要關閉第二個記事本,而不是像你在其他4例子? – Robert 2012-02-21 08:39:23

0

您在整個過程中foreach (Process p in Process.GetProcesses("."))迭代循環並殺死任何進程與開始"NotepadName.txt"標題。

如果你只想殺死第二個實例,你將不得不修改循環中的邏輯以更具選擇性。

int i = 0; 
foreach (Process p in Process.GetProcesses(".")) 
{ 
    if (p.MainWindowTitle.Length > 0) 
    { 
     if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt") 
     { 
      i++; 
      if(i == 2){ 
       p.Kill(); 
       break; 
      } 
     } 
    } 
} 
+0

爲了殺死第二個實例,我們應該定義「second」是什麼意思,或者他們用什麼順序來爲進程編號。你的代碼基本上會殺死_some_記事本進程(如果有多個記事本進程)。不_second_,但_some_。 – penartur 2012-02-21 08:46:02

+0

我知道這段代碼的缺點。這是對OP原始代碼的修正。 OP簡單地陳述「我只想關閉第二個記事本應用程序」。並沒有指定「第二個」是什麼意思。如果你有更多的信息,請發表一個答案。 – 2012-02-21 09:25:18

+0

我已經問過OP,它們是什麼意思,「第二」,但我敢肯定它們並不意味着「一些」。而且你的代碼可能會讓人困惑,因爲在試圖殺死_some_進程時,它會用'i'做一些事情,根本不需要,就好像在Process.GetProcesses中的特定索引處選擇值是有道理的。 – penartur 2012-02-21 09:31:19

0

首先,我想你的意思是你只想關閉正在查看NotepadName.txt文件的記事本進程。您可能試圖拒絕對該文件的訪問(或者出於任何原因關閉訪問該文件的人)。所以我忽略了「第二」部分。

我運行了你的代碼並進行了測試,並且只能關閉正在訪問我定位的文件的記事本進程。

但是我注意到你的比較是絕對不正確的。

//not all processes have a string of 31 characters 
//so sometimes it will trigger an exception 
if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt") 
    { 
     p.Kill(); 
    } 

你的目的,更換

if (p.MainWindowTitle.Contains("NotepadName.txt")) 
    { 
     p.Kill(); 
    } 

從我跑的測試,這應該工作。

+0

我的錯。它應該只有: if(p.MainWindowTitle.ToString ==「」) { p.Kill(); } //謝謝btw。 – 2012-02-21 23:32:34

+0

如果你有工作,記得把問題標記爲已回答 – 2012-02-22 07:59:16

0

有很多搞亂PIDs,所以我必須寫一個更清晰的答案,每個人都回答的問題(雖然這可能不是一個原始問題)。

因此,爲了殺第二(在過程開始時的順序)工藝fullfilling在你的榜樣的條件,你應該寫

var processToKill = (from p in Process.GetProcesses(".") where p.MainWindowTitle.Length > 0 and p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt" order by p.StartTime).Skip(1).FirstOrDefault(); 
if(processToKill != null) 
{ 
    processToKill.Kill(); 
}