利用Mutext实现单实例程序

    /// <summary>
    /// 使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权的 Boolean 值初始化 <see cref="T:System.Threading.Mutex"/> 类的新实例。
    /// </summary>
    /// <param name="initiallyOwned">如果为 true,则给予调用线程已命名的系统互斥体的初始所属权(如果已命名的系统互斥体是通过此调用创建的);否则为 false。</param>
    ///<param name="name"><see cref="T:System.Threading.Mutex"/> 的名称。如果值为 null,则 <see cref="T:System.Threading.Mutex"/> 是未命名的。</param>
    ///<param name="createdNew">在此方法返回时,如果创建了局部互斥体(即,如果 <paramref name="name"/> 为 null 或空字符串)或指定的命名系统互斥体,则包含布尔值 true;如果指定的命名系统互斥体已存在,则为 false。此参数未经初始化即被传递。</param>
    ///<exception cref="T:System.UnauthorizedAccessException">命名的互斥体存在并具有访问控制安全性,但用户不具有 <see cref="F:System.Security.AccessControl.MutexRights.FullControl"/>。</exception>
    ///<exception cref="T:System.IO.IOException">发生了一个 Win32 错误。</exception>
    ///<exception cref="T:System.Threading.WaitHandleCannotBeOpenedException">无法创建命名的互斥体,原因可能是与其他类型的等待句柄同名。</exception>
    ///<exception cref="T:System.ArgumentException"><paramref name="name"/> 长度超过 260 个字符。</exception>
    [SecurityCritical]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    [__DynamicallyInvokable]
    public Mutex(bool initiallyOwned, string name, out bool createdNew)
      : this(initiallyOwned, name, out createdNew, (MutexSecurity) null)
    {
    }

out返回值,能创建互斥体,则返回true,不能创建互斥体Mutex,则说明已经存在运行的实例,返回false。

bool isAppRunning = false;
System.Threading.Mutex mutex = new System.Threading.Mutex(true,System.Diagnostics.Process.GetCurrentProcess().ProcessName,out isAppRunning);
if (!isAppRunning)
{
    MessageBox.Show("本程序已运行");
    Environment.Exit(1);
}
else
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
或者
//Mutex互斥类主要特点就是进程间共享,进程间互相排斥,抢锁,用名称做标识。
bool createdNew ;
Mutex mutex = new Mutex( false , "aaaa" , out createdNew) ;
if( mutex.WaitOne(1000,false ) )
{
    try
    {
        Console.WriteLine( "正常启动。" ) ;
    }
    finally
    {
        mutex.ReleaseMutex() ;
    }
}
else
{
    Console.WriteLine( "你已启动了一个" ) ;
}
时间: 2024-10-07 00:42:12

利用Mutext实现单实例程序的相关文章

win32 单实例程序运行-无窗口程序也可

<span style="font-family: Arial, Helvetica, sans-serif;">在main(WinMain.tWinMain)函数之前做一个数据共享段:</span> #pragma data_seg("Shared") int volatile g_lAppInstance = 0; #pragma data_seg() #pragma comment(linker,"/section:Share

单实例应用程序

一.概念:一个程序在系统中只能启动一个实例,这样的程序称为单实例应用程序.例如Windows下的任务管理器.回收站.播放器.文件系统等等. 二.实现思想与方法: (1)核心思想:在当前系统中,只需要有能表示程序是否启动的标志,那么就可以利用它来实现单实例应用程序. (2)具体步骤:每当程序启动的时候,都需要先检测这个启动标志,当标志指示已经有实例存在,则当前程序退出,否则运行业务. (3)实现单实例应用程序的方法:共享内存.绑定端口.命名管道.文件锁等等. 三.实现案例:运用文件锁实现 代码转载

c#设计应用程序单实例运行

利用WindowsFormsApplicationBase的IsSingleInstance来控制应用程序只能单实例运行. [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)] public static extern int ShowWindow(IntPtr hwnd, int nCmdShow); [DllImport("User32.dll"

【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前面两篇博客已经将Hibernate的基础知识讲解得差不多了,差不多到写实例的时候了. 本篇只用hibernate进行单表的增删改查. 应用Hibernate,对students表进行增删改查. service层和DAO层,我都是直接写实现类了(因为这里主要是演示一下Hibernate的使用),如果是开发项目,注意一定要写接口! 准备数据库: 首先准备一个students表: cr

使用 WPF 创建单实例应用程序

一个简单的例子就是大家在使用很多应用程序,例如在使用Microsoft Word 时会遇到一种情况,不管你打开多少个文档,系统一次只能加载一个winword.exe 实例.当打开新文档时,文档在新窗口显示,但是始终只有一个应用程序控制所有文档窗口:如:可以提供平铺当前所有文档中相邻窗口的文档的特性. 对于创建单实例的应用程序,WPF本身没有提供自带的解决方法,但可以通过变通的方式来实现——思路是当触发ApplicationStartup事件时,检查另一个实例是否在运行.方法是通过使用全局的mut

WPF:如何实现单实例的应用程序(Single Instance)

原文:WPF:如何实现单实例的应用程序(Single Instance) 好吧,这是我将WPF与Windows Forms进行比较的系列文章的第四篇,讨论一下如何实现单实例(single instance) 先来看第一种最简单粗暴的做法: 检测进程名,如果名称一样,则表示程序已经启动了,就不再启动. protected override void OnStartup(StartupEventArgs e) { // Get Reference to the current Process Pro

单链表操作实例程序

#include <iostream> #include <iomanip> using namespace std; typedef struct node { int val; node *next; }node; node * create_list(); void traverse_list(node *pHead); int get_len_list(node *pHead); bool delete_list(node *pHead,int pos,int &v

C++实现程序单实例运行的两种方式

简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫描进程列表比对进程名来检测,第二种方法是通过枚举程序窗口的方式,第三种方法是采用共享全局变量来实现,第四种方法是通过创建互斥体来实现. 那么在这些方法中,第一种和第二种方法是有缺陷的,扫描进程列表比对进程名容易对相同进程名字的不同程序产生误报,枚举窗口不适用于无窗口程序且与扫描进程列表的方法也有相同

利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe)

原文:利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe) 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了.这样交给用户很不方便,希望的效果是直接交付一个exe文件. 这时候就需要借助一款名为Fody.Costura的插件.Fody.Costura是一个Fody框架下的插件,可通过Nuget安装到VS工程中.安装之后,就可以将项目所依赖的DLL(甚至PDB)文件全部打包到EXE文件里. 使用 Costura