2014-07-21 68 views
0

我必須要2個列表框,另一個是用於獲取特定過程(我將它列入類似chrome,mspaint,記事本等),當這些程序運行我的標籤顏色時會變綠,當其中一個程序關閉時,標籤會變爲紅色,然後是接近的程序名稱。我的問題是,當我關閉任何程序時,我無法指定關閉的程序,它只會在我的標籤始終變爲紅色時執行。在c#中獲取任務管理器的特定過程

這裏是我的代碼:

private void running_process() 
{ 
    Process[] processes = Process.GetProcesses("PCNAME"); 

    foreach (Process p in processes) 
    { 
     foreach (string item in listBox2.Items) 
     { 
      if (item == p.ProcessName) 
      { 
       listBox1.Items.Add(p.ProcessName); 
      } 
      if (listBox1.Items.Contains(item)) 
       label4.BackColor = Color.Green; 
      else 

       label4.BackColor = Color.Red; 
     } 
    } 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    listBox1.Items.Clear(); 
    running_process(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    timer1.Enabled = true; 
} 
+0

你能澄清 - 你有2個列表框。 ListBox1 - 適用於在listBox2和listBox2中運行AND的進程,以過濾所有進程。如果這些清單不同,label4應該是紅色的,如果它們相同,它們應該是綠色的? – JleruOHeP

+0

我覺得這是一個設計問題,你可能需要存儲所有進程ID來檢查它是否關閉。 – Prisoner

+0

@JleruOHeP label4應該是紅色,如果其中一個程序是關閉的,並且如果列表框2中列出的所有程序都在運行,則該標籤爲綠色 – NatsuDragneel

回答

0

的問題與您的代碼是您爲每次迭代設置label4.BackColor,因此將只保留價值的最後一個。所以如果你在listBox2中的最後一個進程是在listBox1中,那麼標籤應該是綠色的,如果不是 - 那麼紅色。

我不知道我是否正確地獲得了你的需求(按照listBox1),但是如果你想讓它保持正在運行並列在listBox2中的進程(因爲它在你的代碼中),那麼這應該工作:

label4.BackColor = Color.Green; //by default the label color is Green 
foreach (string item in listBox2.Items) 
{ 
    var processDeleted = true; //and by default we suppose that every process was deleted 
    foreach (var process in processes) 
    { 
     if (process.ProcessName == item) 
     { 
      listBox1.Items.Add(process.ProcessName); 
      processDeleted = false; 
     } 
    } 
    if (processDeleted) label4.BackColor = Color.Red; 
} 

但是這樣你可以得到爲ListBox相似的條目的大名單,所以我會寫這樣的:

label4.BackColor = Color.Green; 
foreach (string item in listBox2.Items) 
{ 
    if (processes.Any(x => x.ProcessName == item)) 
     listBox1.Items.Add(item); 
    else 
     label4.BackColor = Color.Red; 
} 
相關問題