今次介绍一个应用程序单例唯一运行方案的代码。

  我们知道,有些应用程序在操作系统中需要单例唯一运行,因为程序多开的话会对程序运行效果有影响,最基本的例子就是打印机,只能运行一个实例。这里将笔者单例运行的代码共享出来,需要的读者请自己复用该代码到自己的项目中即可。

  1、  项目目录;

  下面是项目目录,因为是一段代码,所以给出的例子比较简单。

  2、  代码介绍;

  这里的代码挺简单的,就是获取应用程序的GUID和运行的进程进行判断,因为GUID唯一,所以更改了程序名称或者改变了目录都不会有影响;而运行进程判断是附加的方式,防止当前目录的程序运行多次。

  1. 1 namespace ProgramInstance
  2. 2 {
  3. 3 using System;
  4. 4 using System.Diagnostics;
  5. 5 using System.Reflection;
  6. 6 using System.Runtime.InteropServices;
  7. 7 using System.Threading;
  8. 8
  9. 9
  10. 10 /// <summary>
  11. 11 /// 单例程序操作类
  12. 12 /// </summary>
  13. 13 internal class SingleInstance
  14. 14 {
  15. 15 /// <summary>
  16. 16 /// 程序是否运行
  17. 17 /// </summary>
  18. 18 /// <returns>true 程序已运行;false 程序未运行</returns>
  19. 19 internal static bool IsRunning(out Process process)
  20. 20 {
  21. 21 //如果判断全系统唯一,直接用下列方法;如果判断当前文件夹唯一,则将GUID判断去掉;
  22. 22 new Mutex(true,
              new Guid(((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(),
                typeof(GuidAttribute))).Value).ToString("N"),
              out bool createdNew);
  23. 23 process = RunningInstance();
  24. 24 return (!createdNew || (process != null));
  25. 25 }
  26. 26 /// <summary>
  27. 27 /// 获取当前程序进程实例
  28. 28 /// </summary>
  29. 29 /// <returns>程序进程实例</returns>
  30. 30 private static Process RunningInstance()
  31. 31 {
  32. 32 Process currentProcess = Process.GetCurrentProcess();
  33. 33 foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
  34. 34 {
  35. 35 if ((process.Id != currentProcess.Id) &&
                  (Assembly.GetExecutingAssembly().Location.Replace("/", @"\") == currentProcess.MainModule.FileName))
  36. 36 {
  37. 37 return process;
  38. 38 }
  39. 39 }
  40. 40 return null;
  41. 41 }
  42. 42 }
  43. 43 }
  1. 1 namespace SingleInstance
  2. 2 {
  3. 3 using System;
  4. 4 using System.Diagnostics;
  5. 5 using System.Runtime.InteropServices;
  6. 6 using System.Windows.Forms;
  7. 7
  8. 8 /// <summary>
  9. 9 /// 程序类
  10. 10 /// </summary>
  11. 11 internal static class Program
  12. 12 {
  13. 13 [DllImport("User32.dll")]
  14. 14 private static extern bool SetForegroundWindow(IntPtr hWnd);
  15. 15 [DllImport("User32.dll")]
  16. 16 private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  17. 17
  18. 18 /// <summary>
  19. 19 /// 应用程序的主入口点
  20. 20 /// </summary>
  21. 21 [STAThread]
  22. 22 static void Main()
  23. 23 {
  24. 24 if (ProgramInstance.SingleInstance.IsRunning(out Process process))
  25. 25 {
  26. 26 ShowWindowAsync(process.MainWindowHandle, 9 | 1);
  27. 27 SetForegroundWindow(process.MainWindowHandle);
  28. 28
  29. 29 return;
  30. 30 }
  31. 31
  32. 32
  33. 33 Application.EnableVisualStyles();
  34. 34 Application.SetCompatibleTextRenderingDefault(false);
  35. 35
  36. 36 Application.Run(new Form1());
  37. 37 }
  38. 38 }
  39. 39 }

  3、  运行截图;

  因为是代码段复用,所以这里不提供运行截图了。

  4、  源码下载;

  需要该例子代码的,请移步到下面链接进行下载:

  https://download.csdn.net/download/lzhdim/88158095

  上面介绍了C#编写的应用程序单例运行的例子,希望对有该需求的读者以帮助。后面会将笔者认为有用的代码段共享出来,让需要的读者进行代码段复用。

  注:如果需要应用程序多开(放到其它文件夹中,或者在当前文件夹中复制更改应用程序名称),请将GUID的判断去掉即可。

基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章的更多相关文章

  1. C#应用程序配置文件(XML序列化) - 开源研究系列文章

    上次写了一个C#线程池及管理器的博文( C#开发的线程池和管理器 - 开源研究系列文章 ),收到了不小的浏览量,在此感谢各位网友的支持.这次将另一个功能放出来单独讲解:C#应用程序的配置文件,使用的是 ...

  2. C#开发的插件程序 - 开源研究系列文章

    上次编写了一个家庭小助手的小工具软件,也对其中的线程池及管理器进行了介绍(见博文:C#开发的线程池和管理器 - 开源研究系列文章),这次把里面的插件部分的功能单独放出来进行介绍,让更多的朋友能够进行学 ...

  3. C#开发的资源文件程序(可国际化) - 开源研究系列文章

    上次将小软件的线程池描述了,也将插件程序描述了,这次就将里面的资源文件相关的内容进行下记录,这里能够让程序做成国际化的形式(即多语言程序),主要就是通过这个资源文件的方式进行的处理.下面将对这个资源文 ...

  4. (一二三)基于GCD的dispatch_once实现单例设计

    要实现单例,关键是要保证类的alloc和init只被调用一次,并且被自身强引用防止释放. 近日读唐巧先生的<iOS开发进阶>,受益匪浅,通过GCD实现单例就是收获之一,下面把这个方法与大家 ...

  5. PHP实现程序单例执行

    原创文章,转载请注明出处:http://huyanping.sinaapp.com/?p=222 作者:Jenner 一.场景描写叙述: 近期我们一块业务.须要不断的监听一个文件夹的变化.假设文件夹中 ...

  6. C#实现程序单例日志输出

    对于一个完整的程序系统,一个日志记录是必不可少的.可以用它来记录程序在运行过程中的运行状态和报错信息.比如,那些不想通过弹框提示的错误,程序执行过程中捕获的异常等. 首先,在你的解决方案中,适当的目录 ...

  7. C#应用程序单例并激活程序的窗口 使其显示在最前端

    public class SoftHelper { ///<summary> /// 该函数设置由不同线程产生的窗口的显示状态 /// </summary> /// <p ...

  8. C# 应用程序单例(禁止多开) 获取.net版本号 以及 管理员权限

    Mutex不仅提供跨线程的服务,还提供跨进程的服务.当在构造函数中为Mutex指定名称时,则会创建一个命名了的Mutex.其他线程创建Mutex时,如果指定的名称相同,则返回同一个互斥体,不论该线程位 ...

  9. Inno Setup安装程序单例运行

    1.源起: KV项目下载底层升级包,老是报出升级文件占用问题,反复分析,不得其所. 今天突然发现同时启动多个升级程序实例,分析认为安装包同时被调用多次,引发实例访问文件冲突,导致此问题. 安装程序由I ...

  10. [WPF]限制程序单例运行

    代码 System.Threading.Mutex mutex; protected override void OnStartup(StartupEventArgs e) { bool ret; m ...

随机推荐

  1. GaussDB(DWS)网络流控与管控效果

    摘要:本文主要介绍GaussDB(DWS)网络流控能力,并对其管控效果进行验证. 本文分享自华为云社区<GaussDB(DWS)网络流控与管控效果>,作者:门前一棵葡萄树. 上一篇博文Ga ...

  2. elSelect点击空白处无法收起下拉框(失去焦点并隐藏)

    学习记录,为了以后有同样的问题,省得再百度了,方便自己也方便你们element 中多选的select 有个问题,就是点击空白或者关闭弹窗,下拉还会一直展示出来百度了好一会,觉得下面两位大佬说的最合理, ...

  3. 学习Golang时遇到的似懂非懂的概念

    背景 这是我学习golang的第三天,大致已经掌握了golang的语法,但是着手开发的时候,却遇到了许多问题,例如golang导包机制.golang的项目管理规范.go mod生成project怎么管 ...

  4. 做了个vscode 小插件,用于修改window 的颜色以区分同时打开的不同工作区,快用起来吧!

    Coralize marketplace/coralize 以高效且便捷的方式自定义Visual Studio Code工作区窗口的状态栏.标题栏以及活动边栏等颜色!这将对那些需要同时打开多个vsco ...

  5. 2022-03-04:爱吃香蕉的珂珂。 珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 珂珂可以决定她吃香蕉的速度 K (单位:根

    2022-03-04:爱吃香蕉的珂珂. 珂珂喜欢吃香蕉.这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉.警卫已经离开了,将在 H 小时后回来. 珂珂可以决定她吃香蕉的速度 K (单位:根 ...

  6. Vue3.3 的新功能的一些体验

    Vue3 在大版本 3.3 里面推出来了一些新功能(主要是语法糖),网上有各种文章,但是看起来似乎是一样的. 我觉得吧,有新特性了,不能光看,还要动手尝试一下. DefineOptions 宏定义 先 ...

  7. sqlmap的一些简单使用命令

    路径 C:\Users\Administrator\AppData\Local\Programs\Python\Python39\sqlmap post型注入 *每次使用都要重新抓包,不可以使用旧的数 ...

  8. 简单了解一下国产CPU

    这几天在B站.油管上刷了一些国产芯片真实上手视频,顺便自己也梳理一下芯片的一些基本概念,以及在美国科技制裁和围堵的情况下,国产CPU的发展情况.文末有我整理的一张思维导图,hope u find it ...

  9. 尤雨溪创立 Vue.js 的心路历程纪录片

    Show More 本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅 ...

  10. 强国杯南部西部赛区分区晋级赛WP

    Misc 空白文件 解压的文件,通过kali strings 查看到base64加密,把%7B换成'{',%7D换成'}' 迷惑的时间 导出3.jpg原始数据信息 去掉没用的头部信息,得到3.jpg图 ...