C# 只允许运行一个实例
转载自http://blog.csdn.net/jin20000/archive/2008/10/24/3136791.aspx
互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允 许打开一个窗体",还有Bitcomet等. 我也是看到这些软件的这个功能才来研究这个问题的. 要实现程序的互斥,通常有三中方式,下面 用 C# 语言来实现:
实现方式一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.C#实现如下:
把program.cs文件里的Main()函数改为如下代码:
static void Main()
{
bool runone;
System.Threading.Mutex run = new System.Threading.Mutex(true, "xinbiao_a_test", out runone);
if (runone)
{
run.ReleaseMutex();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else
{
MessageBox.Show("已经运行了一个实例了。");
}
}
说明:程序中通过语 句 System.Threading.Mutex run = new System.Threading.Mutex(true, "xinbiao_a_test", out runone); 来申明一个互斥体变量run,其中"xinbiao_a_test"为互斥体名,布尔变量runone用来保存是否已经运行了该程序事例.
实现方式二: 采用判断进程的方式,我们在运行程序前,查找进程中是否有同名的进程,同时运行位置也相同程,如是没有运行该程序,如果有就就不运行.在C#中应用System.Diagnostics名字空间中的Process类来实现,主要代码如下:
1,在program.cs文件中添加函数如下:
public static System.Diagnostics.Process RunningInstance()
{
System.Diagnostics.Process current = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process process in processes) //查找相同名称的进程
{
if (process.Id != current.Id) //忽略当前进程
{ //确认相同进程的程序运行位置是否一样.
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", @"\") == current.MainModule.FileName)
{ //Return the other process instance.
return process;
}
}
} //No other instance was found, return null.
return null;
}
2,把Main ()函数改为如下代码:
static void Main()
{
if(RunningInstance()==null)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else
{
MessageBox.Show("已经运行了一个实例了。");
}
}
实现方式三:全局原子法,创建程序前,先检查全局原子表中看是否存在特定原子A(创建时添加的),存在时停止创建,说明该程序已运行了一个实例;不存在则运行程序并想全局原子表中添加特定原子A;退出程序时要记得释放特定的原子A哦,不然要到关机才会释放。C#实现如下:
1、申明WinAPI函数接口:
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern UInt32 GlobalAddAtom(String lpString); //添加原子
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern UInt32 GlobalFindAtom(String lpString); //查找原子
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom); //删除原子
2、修改Main()函数如下:
static void Main()
{
if (GlobalFindAtom("xinbiao_test") == 77856768) //没找到原子"xinbiao_test"
{
GlobalAddAtom("xinbiao_test"); //添加原子"xinbiao_test"
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else
{
MessageBox.Show("已经运行了一个实例了。");
}
}
3、在FormClosed事件中添加如下代码:
GlobalDeleteAtom(GlobalFindAtom("xinbiao_test"));//删除原子"xinbiao_test"
以上为创建互斥程序(进程)的基本通用的思想,个人认为,第一种方法最好。以上所有代码都在VS.NET2005 中测试通过。
转载于:https://www.cnblogs.com/ZJoy/archive/2010/12/17/1909580.html
C# 只允许运行一个实例相关推荐
- 解决C#程序只允许运行一个实例的几种方法详解
解决C#程序只允许运行一个实例的几种方法详解 参考文章: (1)解决C#程序只允许运行一个实例的几种方法详解 (2)https://www.cnblogs.com/randyzhuwei/p/5403 ...
- C#程序只允许运行一个实例的解决方案
最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...
- C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码
2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...
- C# WinForm 判断程序是否已经在运行,且只允许运行一个实例
static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] ...
- delphi 只允许运行一个实例的三种方法《转》
一.创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1UsesWindows,Form,FrmMain in 'FrmMain.pas' {MainForm} ...
- 只允许运行一个实例的方法
查找窗口法 TCHAR wndName = ["blahblah"]; hWnd = FindWindow(NULL, wndName); if(hwnd == 0) // 没找到 ...
- C++程序只允许运行一个实例
函数原型: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,//必须为NULLBOOL bInitialOwner, //表示m ...
- C# WinForm只允许运行一个窗体实例
大概看了看别人的方法,都是从语法的角度巧妙实现的. 我要实现的目的是dialogForm.Show(); 点击按钮显示对话框窗体,如果窗体没有关闭,再次点击,不重复显示. 我用了个笨方法,就是用一个静 ...
- 只运行一个实例的方法
在VC++ 中编程中,只运行一个实例的方法主要有两类: 1 遍历当前的所有窗口,查找相同的实例.为了便于查找,一般要事先设一个查找标志. 2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例. ...
- 转:让程序只运行一个实例的四种方法
先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...
最新文章
- javascript 自动按按钮
- 移动互联网的创新与91生态
- 《NodeJS开发指南》第五章微博实例开发总结
- Java NIO总结
- maven编译的时候排除junit测试类
- 详述白盒测试的逻辑覆盖法的条件判定覆盖及其优缺点
- 【JAVA 第三章 流程控制语句】课后习题 计算两个日期之间的天数
- 使用fiddler抓取安卓模拟器包
- uva11549Calculator Conundrum
- “华为电气—艾默生”系——成就A股最多上市公司的创业群体
- WP采集插件全自动采集伪原创发布插件免费
- 微商新传奇奢瑞小黑裙、两家小程序内测成员都来这了,SDCC2016微信开发专题议题揭晓...
- python大侠个人信息查询_个人信息查询,教你怎么调查一个人的资料
- 如何设置Sketch快捷键,Sketch提升效率的常用技巧
- 移动宽带套餐介绍_中国移动宽带套餐有哪些,谢谢!
- 操作系统内存管理及虚拟内存技术
- eclipse离线安装PMD(含PMD离线包)
- 数的变幻(魔术师的猜牌术(2))
- android中如果在手机显示logo不清楚的问题
- COMSOL无线充电线圈仿真
热门文章
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_23、SpringBoot2.x启动原理概述...
- git 版本控制库的用法及其介绍
- The King’s Problem 强连通
- Rancher快速入门
- JAVA Web基础3-Servlet
- bzoj2190: [SDOI2008]仪仗队(欧拉)
- jQueru中数据交换格式XML和JSON对比
- 百度前端技术学院---vue动态数据绑定-3
- 为用户设计良好的接口
- 第十八节:类与对象-构造函数和析构函数-访问控制-对象继承