我必须有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;
}
答案 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;
}