转载自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# 只允许运行一个实例相关推荐

  1. 解决C#程序只允许运行一个实例的几种方法详解

    解决C#程序只允许运行一个实例的几种方法详解 参考文章: (1)解决C#程序只允许运行一个实例的几种方法详解 (2)https://www.cnblogs.com/randyzhuwei/p/5403 ...

  2. C#程序只允许运行一个实例的解决方案

    最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...

  3. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

    2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...

  4. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

    static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   ...

  5. delphi 只允许运行一个实例的三种方法《转》

    一.创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1UsesWindows,Form,FrmMain in 'FrmMain.pas' {MainForm} ...

  6. 只允许运行一个实例的方法

    查找窗口法 TCHAR wndName = ["blahblah"]; hWnd = FindWindow(NULL, wndName); if(hwnd == 0) // 没找到 ...

  7. C++程序只允许运行一个实例

    函数原型: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,//必须为NULLBOOL bInitialOwner, //表示m ...

  8. C# WinForm只允许运行一个窗体实例

    大概看了看别人的方法,都是从语法的角度巧妙实现的. 我要实现的目的是dialogForm.Show(); 点击按钮显示对话框窗体,如果窗体没有关闭,再次点击,不重复显示. 我用了个笨方法,就是用一个静 ...

  9. 只运行一个实例的方法

    在VC++ 中编程中,只运行一个实例的方法主要有两类: 1 遍历当前的所有窗口,查找相同的实例.为了便于查找,一般要事先设一个查找标志. 2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例. ...

  10. 转:让程序只运行一个实例的四种方法

    先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...

最新文章

  1. javascript 自动按按钮
  2. 移动互联网的创新与91生态
  3. 《NodeJS开发指南》第五章微博实例开发总结
  4. Java NIO总结
  5. maven编译的时候排除junit测试类
  6. 详述白盒测试的逻辑覆盖法的条件判定覆盖及其优缺点
  7. 【JAVA 第三章 流程控制语句】课后习题 计算两个日期之间的天数
  8. 使用fiddler抓取安卓模拟器包
  9. uva11549Calculator Conundrum
  10. “华为电气—艾默生”系——成就A股最多上市公司的创业群体
  11. WP采集插件全自动采集伪原创发布插件免费
  12. 微商新传奇奢瑞小黑裙、两家小程序内测成员都来这了,SDCC2016微信开发专题议题揭晓...
  13. python大侠个人信息查询_个人信息查询,教你怎么调查一个人的资料
  14. 如何设置Sketch快捷键,Sketch提升效率的常用技巧
  15. 移动宽带套餐介绍_中国移动宽带套餐有哪些,谢谢!
  16. 操作系统内存管理及虚拟内存技术
  17. eclipse离线安装PMD(含PMD离线包)
  18. 数的变幻(魔术师的猜牌术(2))
  19. android中如果在手机显示logo不清楚的问题
  20. COMSOL无线充电线圈仿真

热门文章

  1. 小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_23、SpringBoot2.x启动原理概述...
  2. git 版本控制库的用法及其介绍
  3. The King’s Problem 强连通
  4. Rancher快速入门
  5. JAVA Web基础3-Servlet
  6. bzoj2190: [SDOI2008]仪仗队(欧拉)
  7. jQueru中数据交换格式XML和JSON对比
  8. 百度前端技术学院---vue动态数据绑定-3
  9. 为用户设计良好的接口
  10. 第十八节:类与对象-构造函数和析构函数-访问控制-对象继承