在c#中获取任务管理器的特定过程

时间:2014-07-21 03:36:56

标签: c# if-statement taskmanager

我必须有2个列表框,另一个用于获取特定进程(我将其列为chrome,mspaint,notepad等)当这些程序运行时,我的标签颜色会变为绿色,当这些程序之一关闭标签将变为红色跟随关闭的程序的名称。我的问题是,当我关闭任何程序时,我无法指定已关闭的程序,我的标签总是变红。

这是我的代码:

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;
}

1 个答案:

答案 0 :(得分: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;
}

但是这样你就可以在listBox1中找到类似条目的大清单,所以我会写一些类似的东西:

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;
}