私は自分の Windows フォーム アプリケーションに取り組んでいます。次のコードを使用して、ボタン クリック イベントで電卓プロセスを開始します。
System.Diagnostics.Process.Start("calc.exe");
ボタンをもう一度クリックすると、別の電卓プロセスが開始されます。では、プロセスが複数回実行されないようにするにはどうすればよいですか?
ありがとう
簡単...プロセスが終了するまでボタンを無効にします。もちろん、何らかのロジックを追加することもできます。
if(!myProcess.HasExited)
{
alert("You've already started the calculator app.");
}
else
{
// start the process
}
個人的には前者が好きです。イベントハンドラーを設定して設定するだけです:
Process.EnableRaisingEvents = true;
イベント ハンドラーが発生し、電卓アプリが終了したことをプログラムに知らせて、ボタンを再び有効にできるようにします。
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.enableraisingevents.aspx
try
{
myProcess.EnableRaisingEvents = true;
myProcess.Exited += new EventHandler(myProcess_Exited);
myProcess.Start();
// disable button
}
catch()
{
// enable button
}
private void myProcess_Exited(object sender, System.EventArgs e)
{
// enable button
}
シンプルに、プロセスが実行されているかどうかを確認する関数を作成します。
public bool IsProcessOpen(string name)
{
foreach (Process process in Process.GetProcesses())
{
if (process.ProcessName.Contains(name))
{
return true;
}
}
return false;
}
プロセスを確認する場所でこの関数を使用します。
if (!IsProcessOpen("calc"))
System.Diagnostics.Process.Start("calc.exe");
アップデート
新しいバージョンの Windows の電卓のプロセスはCalculator.exeに置き換えられます。calc.exeを使用してプロセスが存在するかどうかを確認しようとすると、常に失敗し、calc と電卓の両方を確認する必要があります。ここにスクリーンショットがあります
コード
//If calc.exe or Calculator.exe not exist then start the calculator
if (!IsProcessOpen("calc")|| !IsProcessOpen("Calculator"))
System.Diagnostics.Process.Start("calc.exe");
Process.GetProcessesByName()を使用して、「calc.exe」という名前の実行中のプロセスを検出できます。ただし、これは信頼性が低く、プロセス名は明確ではありません。同じ.exe名を持つまったく異なるプロセスが存在する可能性があります。
正しいアプローチは、プロセスを開始し、Process.Exitedイベントでそれを追跡することです。このような:
Process calc;
private void button1_Click(object sender, EventArgs e) {
if (calc != null) return;
calc = new Process();
calc.StartInfo = new ProcessStartInfo("calc.exe");
calc.EnableRaisingEvents = true;
calc.Exited += new EventHandler(calc_Exited);
calc.SynchronizingObject = this;
calc.Start();
button1.Enabled = false;
}
void calc_Exited(object sender, EventArgs e) {
calc.Exited -= calc_Exited;
calc = null;
button1.Enabled = true;
}
通常、これを行うときは、アプリケーションの最初のインスタンスに制御を移して、それ自体をアクティブ化できるようにします。そうしないと、アプリケーションを起動した人は何が起こっているのか分からず、起動し続けます。
これを実装するには、アプリケーションの起動時に次のように Mutex を作成します。
bool mine = false;
Mutex mutex = new Mutex(true, "Something to identify this", out mine);
if (!mine)
// Application is already running
アプリケーションが 2 回目に起動する場合、Mutex は既に存在するため、SendMessage を使用して最初のアプリケーションをアクティブにすることができます。
これがどのように行われるかの例はここにあります。