質問

さて、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%正確であることを確認する必要があるため、メンテナンスの問題です。ワークステーションでの予期しない停電などの処理。「偽」を残します。そのテーブルのレコードは慎重に処理されました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top