ClickOnce インストールを使用して C# WinForms アプリケーションをデプロイしました。(多くの作業の後)すべてが正常に機能します:)、しかし今、私は問題に直面しています:
[スタート] メニューでアプリケーションのショートカットをクリックするたびに、新しいインスタンスが開始されます。これを避ける必要があります。
複数の起動を防ぐにはどうすればよいですか?
ClickOnce インストールを使用して C# WinForms アプリケーションをデプロイしました。(多くの作業の後)すべてが正常に機能します:)、しかし今、私は問題に直面しています:
[スタート] メニューでアプリケーションのショートカットをクリックするたびに、新しいインスタンスが開始されます。これを避ける必要があります。
複数の起動を防ぐにはどうすればよいですか?
プログラムの起動時に、同じプロセスが既に実行されているかどうかを確認します。
using System.Diagnostics;
static void Main(string[] args)
{
String thisprocessname = Process.GetCurrentProcess().ProcessName;
if (Process.GetProcesses().Count(p => p.ProcessName == thisprocessname) > 1)
return;
}
次のコードを使用します。
[STAThread]
static void Main()
{
using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
{
if(!mutex.WaitOne(0, false))
{
MessageBox.Show("Instance already running");
return;
}
Application.Run(new Form1());
}
}
その件については本当に良い話題があります。ここで見つけることができます: using Mutext。
アプリケーションを起動すると、 main は常に を呼び出しますApplication.Run()
。Application.Run
.exe の実行中のインスタンスがある場合は、テストの前に STAThread-Main メソッドを調べます。
Process p = Process.GetProcesses();
//check for your .exe
こちらの投稿 をご覧ください。
**Mutex**
一部地域で稼働していない場合がございます。コンソール アプリケーションでの使用と同様です。そこでWMI Queryを使ってみました。
これを試してみてください。
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
if (!isStillRunning())
{
Application.Run(new Form1());
}
else {
MessageBox.Show("Previous process still running.",
"Application Halted", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
Application.Exit();
}
}
//***Uses WMI Query
static bool isStillRunning() {
string processName = Process.GetCurrentProcess().MainModule.ModuleName;
ManagementObjectSearcher mos = new ManagementObjectSearcher();
mos.Query.QueryString = @"SELECT * FROM Win32_Process WHERE Name = '" + processName + @"'";
if (mos.Get().Count > 1)
{
return true;
}
else
return false;
}
それが役に立てば幸い。
Mutex
プロセス名を推測することは欠陥や些細なことでいっぱいなので、使用するのが道です。とても素敵なイラストをご覧ください