2014-07-21 43 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; 
} 
相关问题