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

这篇具有很好参考价值的文章主要介绍了基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

  1、  项目目录;

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

        基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章,c#,开发语言

  2、  代码介绍;

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

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

  3、  运行截图;

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

  4、  源码下载;

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

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

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

  注:如果需要应用程序多开(放到其它文件夹中,或者在当前文件夹中复制更改应用程序名称),请将GUID的判断去掉即可。文章来源地址https://www.toymoban.com/news/detail-628942.html

到了这里,关于基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “深入了解API和Python的完美结合:构建强大、灵活的应用程序“

    引言: 在当前科技高速发展的时代,应用程序是各行各业的重要组成部分。而API(Application Programming Interface)作为不同系统之间实现通信和数据交换的桥梁,具有至关重要的作用。而Python作为一种强大而灵活的编程语言,与API的结合更是创造了无限的可能性。本文将深入探讨

    2024年02月16日
    浏览(39)
  • C# 记事本应用程序

    2024年02月10日
    浏览(43)
  • C# 应用程序强制获取焦点

    Windorm和WPF等应用程序想自己获取焦点焦点那是不可能的,只能通过系统的API来实现 上面第一个函数获取的是当前窗体的句柄,  如果窗体应用要获取自己的句柄的话就使用下面的方法获取 拿到句柄的话我们就可以使用SetForegroundWindow将窗体设置为前台应用 这可以能还不够,

    2024年02月12日
    浏览(34)
  • C#程序设计之windows应用程序设计基础

    题目描述 设计一个“简单通讯录”程序,在窗体上建立一个下拉式列表框、两个文本框和两个标签,实现以下功能:当用户在下拉式列表框中选择一个学生姓名后,在“学生姓名”、“地址”两个文本框中分别显示出对应的学生和地址。 代码 窗体代码 运行结果 题目描述 设

    2024年02月06日
    浏览(47)
  • C#桌面应用程序开发的学习路线

    C#桌面应用程序开发的学习路线。以下是一个基本的学习路线,供你参考: 1. C#基础 学习C#的基本语法和面向对象编程(OOP)的概念 了解C#的数据类型、变量和常量 学习控制结构(如条件语句、循环语句)和函数 2. .NET框架和Windows Forms 了解.NET框架的基本概念和架构 学习使用

    2024年02月10日
    浏览(40)
  • 【C#】通过C#代码创建IIS应用程序池和网站

    代码 参考了其他人的代码,做了一些优化,很多代码用不上 例子 参考 自写C#添加网站应用程序池虚拟目录实现网站管理 » 江湖人士 使用命令行在 Windows 11 上启用 IIS Web 服务器-云东方 用C# 代码咋管理IIS呢?_零零妖的博客-CSDN博客 C#IIS网站应用程序池列表添加修改删除 - -

    2024年02月13日
    浏览(43)
  • [C#] 允许当前应用程序通过防火墙

            通常在一台装有防火墙的电脑上运行程序的场合,往往会弹出对话框提示:是否允许执行该应用程序。          我们在开发软件的时候,可以事先在软件里面设置当前软件为防火墙允许通过的软件。这样,用户在使用时就可以避开前面提到的弹框了。          

    2024年02月09日
    浏览(47)
  • C#学习教程12——Windows窗体应用程序

    WinForm 是 Windows Form 的简称,是基于 .NET Framework 平台的客户端(PC软件)开发技术,一般使用C#编程。Windows应用程序与Windows操作系统的界面类似,每个界面都是由窗体构成的,并且能通过鼠标单击、键盘输入等操作完成相应的功能。 在Visual Studio 2019软件中,点击创建新项目。

    2024年02月03日
    浏览(80)
  • C#:WinForm应用程序中用鼠标移动控件位置

    有时候在WinForm程序中,我们需要用鼠标移动程序窗口中的对象(例如图片对象等)的位置,可以通过定义控件的鼠标事件来实现。以命名为pictureBox1的PictureBox控件为例,分别定义它的MouseDown(按下鼠标按钮)、MouseMove(移动鼠标)、MouseUp(释放鼠标按钮)三个事件,代码如

    2024年02月16日
    浏览(42)
  • C#控制台应用程序如何添加窗口关闭事件?

    公司有一个控制台应用程序,在关闭控制台应用程序窗口前,想处理一下业务逻辑。还有比如误操作关闭了,或者像消息队列启动了发送消息提醒,那关闭了窗口代表控制台应用销毁了,也需要发送消息通知。那这个时候添加关闭窗口事件就派上用场了。 很多小伙伴问,有没

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包