アプリケーションの複数のインスタンスを制限する
-
05-07-2019 - |
質問
さて、c#アプリケーションを作成し、そのインストーラーを作成し、マシンにインストールして動作するようにしました。
問題は、ユーザーがアプリケーションexeを2回開くと、アプリケーションの2つのインスタンスが実行されることです。アプリケーションのインスタンスをいつでも1つだけ実行したいのですが、どうすればいいですか?
ご協力ありがとうございます
解決
これの一般的な手法は、名前付き Mutex
を作成し、アプリケーションの起動時にその存在を確認することです。
DDJからのコード:
class App : Form
{
Mutex mutex;
App()
{
Text = "Single Instance!";
mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
if (!mutex.WaitOne(0, false))
{
mutex.Close();
mutex = null;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
mutex.ReleaseMutex();
base.Dispose(disposing);
}
static void Main()
{
App app = new App();
if (app.mutex != null) Application.Run(app);
else MessageBox.Show("Instance already running");
}
}
他のヒント
iはこれでこの問題を解決しました
[STAThread]
static void Main()
{
Process[] result = Process.GetProcessesByName("ApplicationName");
if (result.Length > 1)
{
MessageBox.Show("There is already a instance running.", "Information");
System.Environment.Exit(0);
}
// here normal start
}
それは簡単ですが、より良い解決策を確認する時間はほとんどありませんでした。
メッセージのおかげで。 アレンおよびパウエル:
static void Main()
{
using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
if (!mutex.WaitOne(0, false)) {
string processName = GetProcessName();
BringOldInstanceToFront(processName);
}
else {
GC.Collect();
Application.Run(new Voting());
}
}
}
private static void BringOldInstanceToFront(string processName) {
Process[] RunningProcesses = Process.GetProcessesByName(processName);
if (RunningProcesses.Length > 0) {
Process runningProcess = RunningProcesses[0];
if (runningProcess != null) {
IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
}
}
}
使用している環境はわかりませんが、「単一インスタンスアプリケーション」について留意すべきことは、単一インスタンスを定義する方法です。共通のデータソースを使用して、アプリケーションを複数のワークステーションで同時に実行できる場合、それは問題ですか?同様に、複数のユーザーが同じコンピューターにログインしているターミナルサービスの状況(または「として実行」の状況)については、ユーザーごとに1つのインスタンスのみ、コンピューターごと?それとも、単にユーザーごとに1つのインスタンスでいいのですか?
これらに対する答えは、あなたをある方向から別の方向へ導くかもしれません。たとえば、スコープがコンピューターのグループである「単一インスタンス」アプリケーションがあります。そのワークステーションのグループ内では、1人のユーザーのみが許可されます。これは、現在接続しているユーザーを追跡する共有データソースにテーブルを作成することで管理しました。これは、テーブルが常に100%正確であることを確認する必要があるため、メンテナンスの問題です。ワークステーションでの予期しない停電などの処理。「偽」を残します。そのテーブルのレコードは慎重に処理されました。