36

ClickOnce インストールを使用して C# WinForms アプリケーションをデプロイしました。(多くの作業の後)すべてが正常に機能します:)、しかし今、私は問題に直面しています:

[スタート] メニューでアプリケーションのショートカットをクリックするたびに、新しいインスタンスが開始されます。これを避ける必要があります。

複数の起動を防ぐにはどうすればよいですか?

4

10 に答える 10

44

プログラムの起動時に、同じプロセスが既に実行されているかどうかを確認します。

using System.Diagnostics;

static void Main(string[] args)
{
   String thisprocessname = Process.GetCurrentProcess().ProcessName;

   if (Process.GetProcesses().Count(p => p.ProcessName == thisprocessname) > 1)
      return;           
}
于 2013-02-27T15:05:41.977 に答える
37

次のコードを使用します。

[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());
   }
}

誤解されたミューテックスから

于 2013-02-27T15:01:08.390 に答える
3

その件については本当に良い話題があります。ここで見つけることができます: using Mutext

于 2013-02-27T15:04:09.043 に答える
1

アプリケーションを起動すると、 main は常に を呼び出しますApplication.Run()Application.Run.exe の実行中のインスタンスがある場合は、テストの前に STAThread-Main メソッドを調べます。

Process p = Process.GetProcesses();
//check for your .exe

こちらの投稿 をご覧ください

于 2013-02-27T15:01:49.513 に答える
1

**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;
        }

それが役に立てば幸い。

于 2014-05-23T07:07:34.497 に答える
-3

Mutexプロセス名を推測することは欠陥や些細なことでいっぱいなので、使用するのが道です。とても素敵なイラストをご覧ください

于 2014-01-15T00:38:40.733 に答える