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

yizhihongxing

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#创建Excel多级分组的方法

    C#创建Excel多级分组的方法 概述 在使用C#操作Excel表格时,有时需要将数据按多个字段进行分组展示,这就需要使用Excel中的多级分组功能。本文将介绍如何使用C#创建Excel多级分组,并提供两个示例说明。 示例说明 示例1:使用C#创建Excel多级分组 下面是一个示例代码,演示如何使用C#创建Excel多级分组。 using System; u…

    C# 2023年6月7日
    00
  • 浅谈ASP.NET Core静态文件处理源码探究

    在ASP.NET Core中,静态文件处理是一个非常重要的功能。本攻略将深入探讨ASP.NET Core静态文件处理的源码实现,并提供两个示例说明。 1. 静态文件处理的基本原理 在ASP.NET Core中,静态文件处理的基本原理是将请求映射到文件系统中的静态文件。当请求到达应用程序时,ASP.NET Core会检查请求路径是否匹配静态文件的路径。如果匹配…

    C# 2023年5月17日
    00
  • C# Console.WriteLine()用法案例详解

    C# Console.WriteLine()用法案例详解 简介 C# Console是C#语言中常用的命令行输入输出工具,可以向控制台输出各种不同格式的文本信息,C# Console.WriteLine()是其中一个常用的输出方法。本文将详细讲解Console.WriteLine()的用法,并提供相关示例代码。 Console.WriteLine()的用法 …

    C# 2023年6月7日
    00
  • C# Directory.GetFiles(string path):获取指定目录下的所有文件路径

    Directory.GetFiles(string path) 是C#中的一个静态方法,它返回指定目录中文件的名称,包括该目录中的所有子目录。它是 DirectoryInfo 类的一个实例方法 GetFiles 的静态等效方法。 方法签名 public static string[] GetFiles(string path); public static …

    C# 2023年4月19日
    00
  • C#实现对数组进行随机排序类实例

    C#实现对数组进行随机排序类实例 什么是数组 数组是一个由相同的数据类型组成的有序集合。 如何进行随机排序 在C#中,可以使用Random类来生成随机数,再通过比较大小来进行随机排序。 具体实现代码如下: using System; class Program { static void Main() { int[] numbers = { 1, 2, 3,…

    C# 2023年6月1日
    00
  • 浅谈C#各种数组直接的数据复制/转换

    浅谈C#各种数组之间的数据复制/转换 在C#中,数组的复制和转换是开发中经常遇到的任务。对于不同类型的数组之间的复制和转换,有不同的方法。本篇文章将详细介绍C#中多种数组之间的数据复制和转换。 一、同类型数组的复制 1.1 直接使用复制方法 C#中同类型数组可以直接使用Array类的Copy方法实现数组数据的复制。 示例代码: int[] arr1 = ne…

    C# 2023年6月7日
    00
  • 详解C#中的字符串拼接@

    详解C#中的字符串拼接@ 什么是字符串拼接? 在C#中,我们经常需要将多个字符串连接起来,得到一个完整的字符串。比如在构造SQL语句、拼接URL参数等场景中,字符串拼接是非常常见的操作。在最初的C#版本中,字符串拼接操作主要使用加号(+)进行操作。但是,这种方式会产生很多临时字符串对象,对内存和性能有影响。从C# 2.0版本开始,开发者可以使用字符串拼接运算…

    C# 2023年6月8日
    00
  • C#定时器组件FluentScheduler用法

    C#定时器组件FluentScheduler用法 概述 FluentScheduler是一个C#的定时器组件,通过简洁的API使得编写定时任务变得非常简单。它支持非常灵活的定时方案配置,包括每隔一定时间、某一特定时刻执行、星期几执行等。并且,FluentScheduler支持多线程执行任务,可以极大地提升任务执行效率。 安装 FluentScheduler可…

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