C# Winform程序实现防止多开的方法总结【亲测】

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技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C# 元组和值元组的具体使用

    C# 元组和值元组的具体使用攻略 C# 中提供了元组(tuple)和值元组(ValueTuple)这两种类型,用于表示一个固定数目的有序元素序列,可以将它们看成是一个轻量的数据结构,可以用来传递多个值。下面将详细介绍这两种类型的具体用法。 元组 元组可以用来返回多个值,也可以在方法调用中传递多个值。元组实际上是一个对象,其中包含固定数量的有序元素。可以使用以…

    C# 2023年6月7日
    00
  • C#中ZipHelper 压缩和解压帮助类

    下面我将为您详细讲解“C#中ZipHelper压缩和解压帮助类”的完整攻略。 1. 概述 ZipHelper是一个C#开发的压缩和解压缩帮助类,使用简单方便,目前已经被广泛应用。下面介绍ZipHelper的基本使用方法及示例。 2. 安装 要使用ZipHelper,需要下载NuGet包“ICSharpCode.SharpZipLib”。可以通过NuGet P…

    C# 2023年5月15日
    00
  • 使用grpcui测试ASP.NET core的gRPC服务

    使用 grpcui 测试 ASP.NET Core 的 gRPC 服务 grpcui 是一个用于测试 gRPC 服务的命令行工具,可以方便地测试 gRPC 服务的接口。本攻略将详细介绍如何使用 grpcui 测试 ASP.NET Core 的 gRPC 服务,并提供多个示例说明。 步骤一:安装 grpcui 在使用 grpcui 之前,需要先安装 grpcu…

    C# 2023年5月17日
    00
  • C#实现多文件打包压缩(.Net Core)

    C#实现多文件打包压缩(.Net Core)的攻略主要包括以下步骤: 引入NuGet包 在Visual Studio中打开你的项目,在Solution Explorer中右键点击你的项目,选择Manage NuGet Packages。在NuGet包管理器中搜索并安装DotNetZip库,也可以在Package Manager Console中执行以下命令进…

    C# 2023年6月3日
    00
  • C#(.Net)将非托管dll嵌入exe中的实现

    C# (.Net)可以嵌入非托管dll文件到exe文件中,使得软件的分发和运行更加简单。下面是该过程的实现攻略: 第一步:创建工程 首先,在Visual Studio中创建一个C#应用程序工程。然后,添加非托管dll文件到项目中。注意,该dll文件必须与工程中的所有程序集(包括已添加的其他dll文件)都是兼容的,否则该dll文件会导致工程编译失败。 第二步:…

    C# 2023年6月1日
    00
  • 详解c# 中的DateTime

    详解C#中的DateTime 什么是DateTime DateTime是C#中非常常用的一个类,用于表示时间和日期。它包括年、月、日、时、分、秒、毫秒等各种时间单位,提供了各种方法用于获取、操作和显示时间和日期。 示例1:创建DateTime对象 在C#中创建DateTime对象非常简单,只需要调用DateTime的静态方法之一,或者使用DateTime构造…

    C# 2023年6月1日
    00
  • .NET Core部署为Windows服务的详细步骤

    以下是.NET Core部署为Windows服务的详细步骤: 1. 什么是Windows服务 Windows服务是一种在后台运行的,它可以在Windows操作系统启动时自动启动,并在系统运行时一直运行。Windows服务通常用于执行后台任务,例如监视文件夹、处理消息队列等。 2. 什么是.NET Core .NET Core是微软的一个跨平台开发框架,它支持…

    C# 2023年5月12日
    00
  • 干货来袭! C# 7.0 新特性(VS2017可用)

    干货来袭!C#7.0新特性(VS2017可用)的完整攻略 介绍 C# 7.0 是微软于2017年推出的一项新技术,它具有以下一些新特性: Tuples(元组) Deconstruction(解构) Out Var(输出变量) Local function(本地函数) Ref return and Ref locals(引用返回和引用本地变量) Pattern…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部