如何防止多次启动我的应用?

我使用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()); } } 

来自The Misunderstood Mutex

关于这个问题确实很好。 你可以在这里找到它: 使用Mutext 。

有些时候**Mutex**在某些地区不起作用。 喜欢在控制台应用中使用。 所以我尝试使用WMI查询

试试这个,它会工作。

  ///  /// The main entry point for the application. ///  [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; } 

希望能帮助到你。

启动应用程序时,main始终调用Application.Run() 。 查看您的STAThread-Main方法,在Application.Run测试之前,如果有.exe的运行实例。

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

在这里看到这篇文章。

在WPF中,您可以在App.xaml.cs文件中使用此代码:

 private static System.Threading.Mutex _mutex = null; protected override void OnStartup(StartupEventArgs e) { string mutexId = ((System.Runtime.InteropServices.GuidAttribute)System.Reflection.Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false).GetValue(0)).Value.ToString(); _mutex = new System.Threading.Mutex(true, mutexId, out bool createdNew); if (!createdNew) Current.Shutdown(); else Exit += CloseMutexHandler; base.OnStartup(e); } protected virtual void CloseMutexHandler(object sender, EventArgs e) { _mutex?.Close(); } 

我一直在使用的是

 bool checkSingleInstance() { string procName = Process.GetCurrentProcess().ProcessName; // get the list of all processes by that name Process[] processes = Process.GetProcessesByName(procName); if (processes.Length > 1) { return true; } else { return false; } } 

Windows窗体应用程序中的解决方案禁止再次运行应用程序(重新打开应用程序)。

1-首先添加Class RunAlready.cs

2-Call方法processIsRunning(),带ProgramCs中RunAlready.cs的Name Process

Program.cs中:

 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace Tirage.MainStand { static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready(); string outApp = RunAPP.processIsRunning("Tirage.MainStand"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); MainStand_FrmLogin fLogin = new MainStand_FrmLogin(); if (outApp.Length == 0) { if (fLogin.ShowDialog() == DialogResult.OK) { Application.Run(new MainStand_masterFrm()); } } else MessageBox.Show( "Instance already running"); } } } 

类RunAlready:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PublicClass.Class { public class RunAlready { public string processIsRunning(string process) { string xdescription = ""; System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(process); foreach (System.Diagnostics.Process proc in processes) { var iddd = System.Diagnostics.Process.GetCurrentProcess().Id; if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id) { xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine; xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine; xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine; xdescription += "Virtual memory size : " + proc.VirtualMemorySize64.ToString() + System.Environment.NewLine; } } return xdescription; } } } 
  if (Process.GetProcesses().Count(p => p.ProcessName == "exe name") > 1) { foreach (var process in Process.GetProcessesByName("exe name")) { process.Kill(); } } 

使用Mutex是一种方法,因为猜测进程名称充满了缺陷和琐事。 看看这个非常好的插图