在c#中获得任务管理器的具体过程

本文关键字:过程 任务管理器 | 更新日期: 2023-09-27 18:14:02

我有2个列表框,另一个是获得特定的进程(我列出它像chrome,油漆,记事本等)当这些程序运行时,我的标签颜色会变成绿色,当这些程序之一关闭时,标签会变成红色,后面跟着关闭的程序名称。我的问题是我不能指定关闭的程序,当我关闭任何程序时,我的标签总是变成红色。

下面是我的代码:

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

在c#中获得任务管理器的具体过程

代码的问题在于您为每次迭代设置了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;
}