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日

相关文章

  • Sitecore XP 10.3(latest) Docker一键部署

    本文演示通过PowerShell+Docker Desktop for Windows 一键部署Sitecore10.3(即Sitecore最新版)Docker开发/测试/演示 环境。 官方参考 SitecoreXP 10.3.0 Developer Workstation Deployment With Docker 演示配置为XP Single(XP0)…

    C# 2023年4月27日
    00
  • C#中的分布式ID生成组件IDGen介绍并给出示例代码

    C#中的IDGen是一个C#实现的Twitter Snowflake算法的ID生成器,可以生成全局唯一的ID,支持高并发场景下的ID生成。在本篇文章中,我们将介绍IDGen的使用方法并提供相关的C#示例代码。 IDGen的介绍 IDGen是一款开源的分布式唯一ID生成器,支持多种ID生成算法,并且可以在高并发场景下快速生成全局唯一的ID。目前支持的ID生成算…

    C# 2023年4月24日
    00
  • efcore性能调优

    性能调优——EFCore调优 按下硬件、网络不提,我们单表从程序层面对系统的性能进行优化,翻来覆去无外乎三个方面 缓存 异步 sql本片文章,我们针对.net core web项目的ef core框架进行性能优化。 1. EF Core框架已经本地缓存机制memorycache,所以我们访问一个接口,二次访问的性能相比首次会提升一大截 2.尽可能的通过主键查…

    C# 2023年5月5日
    00
  • C#中查找Dictionary中的重复值的方法

    下面是一份“C#中查找Dictionary中的重复值的方法”的完整攻略: 1. Dictionary类简介 在C#中,Dictionary是一种通用集合类型,它可用于存储键值对。在Dictionary中,键和值都可以是任意类型的对象,而键是唯一的,值则不需要唯一。 Dictionary的主要优势之一就是其快速的查找时间。由于Dictionary是基于哈希表实…

    C# 2023年6月8日
    00
  • 网上考试设计思路是怎样的?

    网上考试设计思路的流程可以分为以下几步: 步骤一:需求分析 在设计网上考试前,我们需要首先进行需求分析。在这一步中,我们需要识别和了解用户的需求和期望。我们需要回答以下问题: 谁将参加考试? 学生,员工或其他人员? 考试的种类和水平?选择题,填空题,还是主观题?考试难度是初级、中级还是高级? 考试的时间和考试的长度?通常适合多长时间的考试,考试又要持续多长时…

    C# 2023年6月7日
    00
  • C#交错数组用法实例

    C#交错数组用法实例 交错数组(Jagged Arrays)也称为不规则数组,是一种多维数组,其每个元素都是一个可以是不同长度的一维数组。在C#中,可以使用交错数组来存储数据。以下是交错数组的定义方式: data_type[][] array_name = new data_type[outerLength][]; 其中,data_type指定数组元素类型,…

    C# 2023年6月7日
    00
  • 在ASP.NET Core中应用HttpClient获取数据和内容

    在ASP.NET Core中,HttpClient是一种用于发送HTTP请求和接收HTTP响应的类。本攻略将深入探讨如何使用HttpClient获取数据和内容,并提供两个示例说明。 使用HttpClient获取数据 使用HttpClient获取数据的步骤如下: 1. 创建HttpClient实例 我们需要创建一个HttpClient实例来发送HTTP请求。以…

    C# 2023年5月17日
    00
  • c#使用filesystemwatcher实时监控文件目录的添加和删除

    C#使用FileSystemWatcher实时监控文件目录的添加和删除 FileSystemWatcher是C#中用于监控文件系统更改的类。它可以监视指定目录中的文件和子目录的创建、更改、重命名和删除等操作,并在这些操作发生时引发事件。在本文中,我们将介绍如何使用FileSystemWatcher实时监控文件目录的添加和删除。 步骤一:创建FileSyste…

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