c#防止多次运行代码收集分享

作者:shangke 时间:2021-09-27 18:28:26 

方法一


class Program
 {
   [STAThread]
   static void Main(string[] args)
   {
     //防止程序多次运行
     if (!OneInstance.IsFirst("MyTest"))
     {
       Console.WriteLine("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!");
       return;
     }
     Console.WriteLine("正在运行中");
     Console.ReadLine();
   }
 }
 public static class OneInstance
 {
   ///<summary>
   ///判断程序是否正在运行
   ///</summary>
   ///<param name="appId">程序名称</param>
   ///<returns>如果程序是第一次运行返回True,否则返回False</returns>
   public static bool IsFirst(string appId)
   {
     bool ret = false;
     if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
     {
       CreateMutex(IntPtr.Zero, 0, appId);
       ret = true;
     }
     return ret;
   }
   [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
   private static extern IntPtr OpenMutex(
     uint dwDesiredAccess, // access
     int bInheritHandle,  // inheritance option
     string lpName     // object name
     );
   [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
   private static extern IntPtr CreateMutex(
     IntPtr lpMutexAttributes, // SD
     int bInitialOwner,            // initial owner
     string lpName              // object name
     );
 }

方法二


string MnName = Process.GetCurrentProcess().MainModule.ModuleName;
//返回不具有扩展名的制定路径字符串的文件名
String Pname = Path.GetFileNameWithoutExtension(MnName);
Process[] myprocess = Process.GetProcessesByName(Pname);
if (myprocess.Length > 1)
{
 MessageBox.Show("yici", "tishi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
 //Application.EnableVisualStyles();
 ////Application.SetCompatibleTextRenderingDefault(false);
 //Application.Run(new Form1());
}

方法三

原文如下(https://www.jb51.net/article/41179.htm)

经常我们会有这样的需求,只让应用程序运行一个实体。通常我们的情况是,双击一个exe文件,就运行一个程序的实体,再双击一次这个exe文件,又 运行这个应用程序的另一个实体。就拿QQ游戏来说吧,一台电脑上一般只能运行一个QQ游戏大厅(不过以前听说过有双开的 * )。

那我们的程序也能像QQ游戏那里禁止多次启动吗,答案是可以的,下面介绍下一个简单的实现方法,那就是Mutex(互斥)。

      Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多个线程同步访问的一个类。它非常类似了Monitor类,因为他们都只有一个线程能拥有锁定。而操作系统能够识别有名称的互 斥,我们可以给互斥一个唯一的名称,在程序启动之前加一个这样的互斥。这样每次程序启动之前,都会检查这个命名的互斥是否存在。如果存在,应用程序就退 出。


static class Program
 {
   /// <summary>
   /// The main entry point for the application.
   /// </summary>
   [STAThread]
   static void Main()
   {
     bool createdNew;
     //系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次
     //第二个参数可以设置为产品的名称:Application.ProductName

//每次启动应用程序,都会验证名称为SingletonWinAppMutex的互斥是否存在
     Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);

//如果已运行,则在前端显示
     //createdNew == false,说明程序已运行
     if (!createdNew)
     {
       Process instance = GetExistProcess();
       if (instance != null)
       {
         SetForegroud(instance);
         Application.Exit();
         return;
       }
     }
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new MainForm());
   }

/// <summary>
   /// 查看程序是否已经运行
   /// </summary>
   /// <returns></returns>
   private static Process GetExistProcess()
   {
     Process currentProcess = Process.GetCurrentProcess();
     foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
     {
       if ((process.Id != currentProcess.Id) &&
         (Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))
       {
         return process;
       }
     }
     return null;
   }

/// <summary>
   /// 使程序前端显示
   /// </summary>
   /// <param name="instance"></param>
   private static void SetForegroud(Process instance)
   {
     IntPtr mainFormHandle = instance.MainWindowHandle;
     if (mainFormHandle != IntPtr.Zero)
     {
       ShowWindowAsync(mainFormHandle, 1);
       SetForegroundWindow(mainFormHandle);
     }
   }

[DllImport("User32.dll")]
   private static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("User32.dll")]
   private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
 }

经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行。所以只限于用在单用户环境,还是不太完美。


class Program
 {
   [STAThread]
   static void Main(string[] args)
   {
     //防止程序多次运行
     if (!OneInstance.IsFirst("MyTest"))
     {
       Console.WriteLine("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!");
       return;
     }
     Console.WriteLine("正在运行中");
     Console.ReadLine();
   }
 }
 public static class OneInstance
 {
   ///<summary>
   ///判断程序是否正在运行
   ///</summary>
   ///<param name="appId">程序名称</param>
   ///<returns>如果程序是第一次运行返回True,否则返回False</returns>
   public static bool IsFirst(string appId)
   {
     bool ret = false;
     if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
     {
       CreateMutex(IntPtr.Zero, 0, appId);
       ret = true;
     }
     return ret;
   }
   [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
   private static extern IntPtr OpenMutex(
     uint dwDesiredAccess, // access
     int bInheritHandle,  // inheritance option
     string lpName     // object name
     );
   [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
   private static extern IntPtr CreateMutex(
     IntPtr lpMutexAttributes, // SD
     int bInitialOwner,            // initial owner
     string lpName              // object name
     );
 }
标签:c#,防止,多次运行
0
投稿

猜你喜欢

  • 详解MyBatis XML配置解析

    2023-11-23 13:02:09
  • 在Java内存模型中测试并发程序代码

    2023-11-24 20:37:55
  • 聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    2023-11-16 08:55:50
  • FeignClient如何脱离eureka自定义URL

    2022-08-27 01:37:25
  • java8从list集合中取出某一属性的值的集合案例

    2023-04-30 01:51:49
  • 关于bootstrap.yml和bootstrap.properties的优先级问题

    2021-10-04 11:50:30
  • 亲自教你实现栈及C#中Stack源码分析

    2021-05-23 19:39:10
  • 深入学习java位运算的基础知识

    2021-06-01 07:10:40
  • IntelliJ IDEA(2020.2)的下载、安装步骤详细教程

    2023-11-25 07:10:16
  • C# 中的IComparable和IComparer的使用及区别

    2023-04-19 20:11:55
  • JDK动态代理原理:只能代理接口,不能代理类问题

    2023-06-16 03:18:40
  • 关于通过java调用datax,返回任务执行的方法

    2023-11-28 21:26:45
  • 解决java读取EXCEL数据变成科学计数法的问题

    2023-06-14 02:17:56
  • Hadoop+HBase+ZooKeeper分布式集群环境搭建步骤

    2022-02-13 01:16:33
  • Java Druid连接池与Apache的DBUtils使用教程

    2021-07-29 13:21:44
  • c#使用正则表达式匹配字符串验证URL示例

    2023-01-01 10:40:10
  • Java--Socket通信(客户端服务端双向)

    2021-09-21 20:58:37
  • 各种格式的编码解码工具类分享(hex解码 base64编码)

    2021-11-17 07:04:51
  • Ajax登录验证实现代码

    2022-02-22 10:47:51
  • Spring钩子接口汇总分析使用示例

    2022-09-24 23:29:56
  • asp之家 软件编程 m.aspxhome.com