C# Winform程序实现防止多开的方法总结【亲测】
当我们同事启动我们编写的C# Winform程序时,有时会发现一个很尴尬的问题,同事同时启动了多个程序。这会给我们的程序带来一些问题,如系统资源的浪费等。因此,为了解决这个问题,我们有必要实现一个防止多开的功能。在本文中,我将介绍三种解决方案。
解决方案一:记录程序运行状态
为了能判断程序是否正在运行中,我们可以记录程序的运行状态,具体方法如下:
static Mutex run;
static bool checkRun(out Mutex run) {
run = new Mutex(false, "Global\\" + Assembly.GetExecutingAssembly().GetName().Name);
return run.WaitOne(TimeSpan.Zero, true);
}
这里我们采用Mutex的方式记录程序的运行状态。当程序运行时,我们会创建一个Mutex变量,其名称为程序的名称,同时加上"Global\"前缀,这样,这个Mutex变量就能在全局范围内可见。我们同时采用了Mutex.WaitOne(TimeSpan.Zero, true)的方式,来检查程序是否正在运行。当程序在运行时,如果再次启动该程序,Mutex.WaitOne就会返回false,程序就能判断出程序正在运行中,从而避免了程序重复启动的问题。实现起来比较简单,但是开启多个程序仍然会导致资源的浪费。
解决方案二:查找已经运行的程序进程
要避免资源的浪费,我们有必要查找已经运行的程序进程,从而让程序知道是否可以启动。实现方法如下:
public static void RunOnlyOne() {
Process instance = RunningInstance();
if (instance == null) {
return;
}
HandleRunningInstance(instance);
}
public static Process RunningInstance() {
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach(Process process in processes) {
if (process.Id != current.Id && process.MainModule.FileName == current.MainModule.FileName) {
return process;
}
}
return null;
}
public static void HandleRunningInstance(Process instance) {
MessageBox.Show("程序已经在运行中,请不要重复运行!");
IntPtr hWnd = instance.MainWindowHandle;
if (hWnd != IntPtr.Zero) {
ShowWindowAsync(hWnd, SW_SHOWNORMAL);
}
}
在这个方式中,我们首先将已经运行的程序进程查找出来。如果已经运行了,我们就会给出提示信息,从而避免了程序的重复启动。这个方式的缺点在于它无法避免程序在一些特殊情况下的重复运行,但是相较于第一种方法,它已经解决了资源浪费的问题。
解决方案三:将程序图标隐藏到系统托盘
要让我们的程序更加优雅,我们可以将程序的图标隐藏到系统托盘中,防止用户在程序启动时重复运行程序。
private void Form1_Resize(object sender, EventArgs e) {
if (WindowState == FormWindowState.Minimized) {
this.Hide();
trayIcon.Visible = true;
trayIcon.ShowBalloonTip(500);
}
}
在该方式中,我们将程序的窗口隐藏,并将图标显示到任务栏中。当用户再次启动程序时,我们会判断程序的窗口是否已经最小化,如果是,那么我们就不再弹出窗口,而是直接销毁程序,避免了重复启动程序。这个方案是相对比较好的方式,但是它依然无法避免程序在一些特殊情况下的重复运行。
示例说明
假设我们编写了一个名为MyProject的C# Winform程序,我们可以在程序中编写如下代码来避免程序多开的问题:
static Mutex run;
static bool checkRun(out Mutex run) {
run = new Mutex(false, "Global\\" + Assembly.GetExecutingAssembly().GetName().Name);
return run.WaitOne(TimeSpan.Zero, true);
}
private void Form1_Load(object sender, EventArgs e) {
if(!checkRun(out run)) {
MessageBox.Show("程序正在运行中,请不要重复启动该程序!");
Application.Exit();
}
}
运行程序时,如果程序正在运行中,那么我们就会弹出提示信息,告诉用户程序已经在运行中了,并且直接退出程序。这样,我们就避免了程序的重复运行问题。
总结
以上就是针对C# Winform程序实现防止多开的方法总结【亲测】的介绍。我们可以通过几种方式,避免程序重复开启,保证程序的正常运行,避免系统资源的浪费。特别要注意的是,我们应该根据不同的需求,选择不同的方案来处理这个问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Winform程序实现防止多开的方法总结【亲测】 - Python技术站