プログラムで達成しようとしているのは、特定のプロセスが実行されているかどうかを知ることです (実行中のすべてのインスタンスについて知る必要があります)。それらをコンボボックスに保持し、オブジェクトとして保存して、後でキャストできるようにします。これは簡単だと思いましたが、結局のところ、頭痛の種になりました:P これがどのように行われるべきかはわかりませんが、機能しています. ただし、このコード ソリューションについては残念です。私はこれに適したプログラミングパターンを知りません。これが、仲間のコーダーに助けを求める理由です。
最初に頭に浮かんだのは、タイマーを使用してプロセスを頻繁にチェックして追加し、Exited イベントを使用してそれらをコンボボックスから削除することです。だからここにタイマーのティックイベントに関する私のコードがあります:
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の奥深くですか?