在使用应用程序的过程中,经常要求应用程序只能运行一次。如果发现重复开启,应从系统进程列表中搜索到已经开启的进程,并将该进程窗口移到最前端显示。

记录一下过程。

实现过程

在 Program.cs 文件的 Program 类中声明两个外部调用函数

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

两个外部调用 User32.dll 文件中的函数,其中SetForegroundWindow 主要用于将窗体移动到最前端显示,ShowWindowAsync函数用于显示窗。

修改 main 函数内容

static void Main()
{
bool createdNew; //是否是第一次开启程序
Mutex mutex = new Mutex(false, "Single", out createdNew);
mutex.WaitOne();
//实例化一个进程互斥变量,标记名称Single
if (!createdNew) //如果多次开启了进程
{
Process currentProcess = Process.GetCurrentProcess();//获取当前进程
foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
{
//通过进程ID和程序路径获取一个已经开启的进程
if ((process.Id != currentProcess.Id) &&
(Assembly.GetExecutingAssembly().Location == process.MainModule.FileName))
{
//获取已经开启的进程的主窗体句柄
IntPtr mainFormHandle = process.MainWindowHandle;
if (mainFormHandle != IntPtr.Zero)
{
ShowWindowAsync(mainFormHandle, 1); //显示已经开启的进程窗口
SetForegroundWindow(mainFormHandle); //将已经开启的进程窗口移动到前端
}
}
}
//MessageBox.Show("进程已经开启");
return;
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainFrame());
mutex.ReleaseMutex(); //释放Mutex一次
}
}

Mutex类,该类位于System.Threading命名空间下,主要用于创建线程或进程的互斥变量。本实例创建了一个名为Single的互斥变量,在运行程序时,首先访问该互斥变量,看该变量是否已经被创建,如果已经被创建,说明已经有相同的进程正在运行。

关于 Mutex锁 :

C# 针对特定的条件进行锁操作,不用lock,而是mutex

c# 如何针对特定的条件进行锁操作?

C# 多线程系列之Mutex使用

Winform 程序多开的更多相关文章

  1. C# Winform程序防止多开的方法总结(亲测)

    1.Winform启动的时候,检测是否存在同样的进程名,防止程序多开: static class Program { /// <summary> /// 应用程序的主入口点. /// &l ...

  2. winform开发 总结1>winform程序使用线程的必要性,以及正确的使用方式

    winform程序中使用线程的必要性: 单线程操作在执行耗时任务时会造成界面假死,带来非常差劲的用户体验,有时候甚至会影响到正常的业务执行,使用多线程做相关操作实属不得已之举. 那么在编写程序之前必须 ...

  3. WinForm程序界面假死,寻求完美解决方案

    故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...

  4. Winform程序

    故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...

  5. ASP.NET程序也能像WinForm程序一样运行[转载]

    阅读目录 开始 操作方式 支持的ASP.NET程序类别 它也是个HTTP服务器 支持远程机器访问 不受限于Windows防火墙 尊重每个人的操作习惯 内置多标签浏览器支持 启动参数及配置文件 支持 . ...

  6. 转:ClickOnce部署Winform程序的方方面面

    1. ClickOnce简介 微软官方对ClickOnce的解释是:ClickOnce 是一项部署技术,您可以利用这项技术来创建基于 Windows 的自行更新的应用程序,并且安装和运行这类应用程序所 ...

  7. Winform程序部署方式总结一——ClickOnce发布

    针对Winform程序,介绍两种常用打包方式:ClickOnce和Windows Installer 应用程序如下: 一.ClickOnce发布 1.找到需要发布的项目文件,右击,从弹出的快捷菜单中找 ...

  8. 记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)

    目标:想在WinForm程序之间传递参数.以便子进程作出相应的处理. 一种错误的方法 父进程的主程序: ProcessStartInfo psi = new ProcessStartInfo(); p ...

  9. 用winform程序来了解委托和事件

    一.浅谈委托 如果有个过winform 和webform 程序开发的小伙伴一定有个这样的感觉吧,点击Button直接就执行了那个方法,到此他是怎么实现了的呢,大家有考虑过没有? 回到正题,什么是委托呢 ...

  10. 基于DevExpress的Winform程序安装包的制作

    在我们做系统开发的时候,都会面临一个安装包制作的问题,如何把我们做好的系统,通过安装包工具整合成一个安装包给客户进行安装.安装包的优势就是一步步安装就可以了,不用复制一大堆文件给客户,还怕缺少那个文件 ...

随机推荐

  1. 如何通过C#合并Word文档?

    合并Word文档可以快速地将多份编辑好的文档合在一起,避免复制粘贴时遗漏内容,以及耗费不必要的时间,同时,也方便了人们阅读或者对其进行再次修改.例如,在我们进行团队作业的时候,每个人都会有不同的分工, ...

  2. SQL注入漏洞原理与利用

    SQL注入漏洞原理与利用 SQL注入漏洞流程 判断注入类型 判断字段个数 查询回显位 查询数据库名 查询表.字段名 查询内容 判断注入类型 1.数字型注入点判断 当要输入的参数x为数字型时,后端脚本中 ...

  3. 视图 触发器 事务 MVCC 存储过程 MySQL函数 MySQL流程控制 索引的数据结构 索引失效 慢查询优化explain 数据库设计三范式

    目录 视图 create view ... as 触发器 简介 创建触发器的语法 create trigger 触发器命名有一定的规律 临时修改SQL语句的结束符 delimiter 触发器的实际运用 ...

  4. @ApiImplicitParams注解的详细使用

    一.@ApiImplicitParams注解的详细使用 业务需求: 1.根据服务员类别id(单个id)+服务员星级id(id的list)查询对应的服务员列表 1.controller代码: 点击查看代 ...

  5. SQLMap入门——判断是否存在注入

    假设目标注入点是http://127.0.0.1/sqli-labs-master/Less-1/?id=1,判断其是否存在注入的命令如下: python sqlmap.py -u http://12 ...

  6. 【SpringBoot实战专题】「开发实战系列」从零开始教你舒服的使用RedisTemplate操作Redis数据

    SpringBoot快速操作Redis数据 在SpringBoot框架中提供了spring-boot-starter-data-redis的依赖组件进行操作Redis服务,当引入了该组件之后,只需要配 ...

  7. S2-052 CVE-2017-9805 远程代码执行

    漏洞名称 S2-052 CVE-2017-9805 远程代码执行 利用条件 Struts 2.1.6 - Struts 2.3.33 Struts 2.5 - Struts 2.5.12 漏洞原理 S ...

  8. (7)go-micro微服务zap日志配置

    目录 一 Zap日志介绍 二 Zap日志安装 三 Zap日志初始化 四 Zap日志重写方法 五 Zap日志使用 六 最后 一 Zap日志介绍 Zap是在 Go 中实现超快.结构化.分级的日志记录. Z ...

  9. 多目标优化经典算法——NSGA-II

    参考博客链接 https://blog.csdn.net/qq_35414569/article/details/79639848?utm_medium=distribute.pc_relevant. ...

  10. 【公式详解】【优秀论文解读】EDPLVO: Efficient Direct Point-Line Visual Odometry

    前言 多的不说哈 2022最佳优秀论文 来自美团无人机团队 作者提出了一种使用点和线的高效的直接视觉里程计(visual odometry,VO)算法-- EDPLVO .他们证明了,2D 线上的 3 ...