我在我的程序中想要完成的是知道某些进程是否正在运行(我需要知道所有正在运行的实例)。我想把它们放在一个组合框中,作为一个对象存储,这样我以后可以把它们放回去。我认为这很容易,但事实证明,这让我有些头疼:P 我不确定这是否应该这样做,但它正在工作。但是,我对这个代码解决方案感觉很糟糕。我不知道任何好的编程模式,这就是为什么我请你们编码人员帮助我。
我想到的第一件事是使用计时器经常检查进程并添加它们,并使用 Exited 事件将它们从我的组合框中删除。所以这是我关于计时器 Tick 事件的代码:
private void timer_ProcessCheck_Tick(object sender, EventArgs e)
{
Process[] tmpArray = Wow_getCurrentlyRunning(); // this returns Process[]
if (comboBox_processes.Items.Count == 0)
{
if (tmpArray.Count() > 0)
for (int Index = 0; Index < tmpArray.Count(); Index++)
Add(tmpArray[Index]); // adding to combobox
}
else
{
if (tmpArray.Count() > comboBox_processes.Items.Count)
{
List<Process> result;
/*Diff compares the two array, and returns to result variable.*/
if (Diff(tmpArray, comboBox_processes, out result))
foreach(Process proc in result)
Add(proc); // adding to combobox
}
}
}
我的 Diff 方法看起来像这样,它将差异放入 diff 变量。
public bool Wow_differsFrom(Process[] current, ComboBox local, out List<Process> diff)
{
List<int> diffIndex = new List<int>();
foreach (Process proc in current)
diffIndex.Add(proc.Id);
for (byte Índex = 0; Índex < current.Count(); Índex++)
{
for (byte Index = 0; Index < local.Items.Count; Index++)
{
if (current[Índex].Id == (local.Items[Index] as Process).Id)
{
diffIndex.Remove(current[Índex].Id);
break;
}
}
}
diff = new List<Process>();
for (int x = 0; x < current.Count(); x++)
for (int i = 0; i < diffIndex.Count; i++)
if (current[x].Id == diffIndex[i])
diff.Add(current[x]);
if (diff.Count == 0)
return false;
return true;
}
这是在进程退出时调用的 Exited 事件处理程序
private void Wow_exitedEvent(object o, EventArgs e)
{
RemoveCBItem(comboBox_processes, (o as Process).Id); // this will remove the process from combobox, also threadsafe.
}
我的问题:
你会怎么做?我接近这个权利吗?我有感觉,我没有。
申请开始有什么活动吗?就像有一个出口。也许深入 Win32 API?