C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper
前言
在开发应用程序时,通常只让程序运行一个实例。所以,就要判断程序是否已经运行。
下面是我自己在项目中使用到,封装好的帮助类。有 普通的 C# 应用程序 和 Windows CE 和 Windows Mobile 应用程序使用的方法。
主要是通过 System.Threading.Mutex 类 和 Win32 API 来实现,下面就是各自的代码,调用示例在最后面。
普通 C# 应用程序
主要是 Windows 窗体应用程序和控制台程序。
1. 使用 System.Threading.Mutex 类
using System.Threading;
namespace XY.Util.Helper
{
/// <summary>
/// Mutex helper
/// </summary>
public class MutexHelper
{
/// <summary>
/// 判断程序是否已经运行
/// <param name="assembly">程序集实例</param>
/// </summary>
/// <returns>
/// true: 程序已运行
/// false: 程序未运行
/// </returns>
public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
{
string strAppName = assembly.GetName().Name;
return IsApplicationOnRun(strAppName);
}
/// <summary>
/// 判断程序是否已经运行
/// <param name="assemblyName">程序名称</param>
/// </summary>
/// <returns>
/// true: 程序已运行
/// false: 程序未运行
/// </returns>
public static bool IsApplicationOnRun(string assemblyName)
{
bool ret = false;
//第一个参数:true--给调用线程赋予互斥体的初始所属权
//第一个参数:互斥体的名称
//第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true
Mutex mutex = new Mutex(true, assemblyName, out ret);
return !ret;
}
}
}
2. 使用 Win32 API
using System;
using System.Runtime.InteropServices;
namespace XY.Util.Helper
{
/// <summary>
/// Mutex helper
/// </summary>
public class MutexHelper
{
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr OpenMutex(uint dwDesiredAccess, bool bInitialOwner, string lpName);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);
/// <summary>
/// 判断程序是否已经运行
/// <param name="assembly">程序集实例</param>
/// </summary>
/// <returns>
/// true: 程序已运行
/// false: 程序未运行
/// </returns>
public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
{
string strAppName = assembly.GetName().Name;
return IsApplicationOnRun(strAppName);
}
/// <summary>
/// 判断程序是否已经运行
/// <param name="assemblyName">程序名称</param>
/// </summary>
/// <returns>
/// true: 程序已运行
/// false: 程序未运行
/// </returns>
public static bool IsApplicationOnRun(string assemblyName)
{
bool ret = false;
if (OpenMutex(0x1F0001, false, assemblyName) == IntPtr.Zero)
{
CreateMutex(IntPtr.Zero, false, assemblyName);
ret = true;
}
return ret;
}
}
}
Windows CE | Windows Mobile 应用程序
在 Windows CE 和 Windows Mobile 中实现,是通过 Win32 API实现的,下面是封装的帮助类:
参考:
using System;
using System.Runtime.InteropServices;
namespace XY.Util.Helper
{
/// <summary>
/// Mutex helper
/// </summary>
public class MutexHelper
{
[DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);
[DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)]
public static extern bool ReleaseMutex(IntPtr hMutex);
private const int ERROR_ALREADY_EXISTS = 0183;
/// <summary>
/// 判断程序是否已经运行
/// <param name="assembly">程序集实例</param>
/// </summary>
/// <returns>
/// true: 程序已运行
/// false: 程序未运行
/// </returns>
public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
{
string strAppName = assembly.GetName().Name;
return IsApplicationOnRun(strAppName);
}
/// <summary>
/// 判断程序是否已经运行
/// <param name="assemblyName">程序名称</param>
/// </summary>
/// <returns>
/// true: 程序已运行
/// false: 程序未运行
/// </returns>
public static bool IsApplicationOnRun(string assemblyName)
{
IntPtr hMutex = CreateMutex(IntPtr.Zero, true, assemblyName);
if (hMutex == IntPtr.Zero)
{
throw new ApplicationException("Failure creating mutex: " + Marshal.GetLastWin32Error().ToString("X"));
}
if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS)
{
ReleaseMutex(hMutex);
return true;
}
return false;
}
}
}
示例代码
调用示例:
using System;
using System.Reflection;
using XY.Util.Helper;
namespace MutexTest
{
static class Program
{
[MTAThread]
static void Main(string[] args)
{
bool run;
//方式一
run = MutexHelper.IsApplicationOnRun("ApplicationName");
//方式二
run = MutexHelper.IsApplicationOnRun(Assembly.GetExecutingAssembly());
if (run)
{
// application is running...
// Exit.
}
else
{
// start application ...
// startup...
}
}
}
}
C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper的更多相关文章
- Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素” C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作
Oracle 远程访问配置 服务端配置 如果不想自己写,可以通过 Net Manager 来配置. 以下配置文件中的 localhost 改为 ip 地址,否则,远程不能访问. 1.网络监听配置 ...
- C# WINFORM判断程序是否运行,且只能运行一个实例(转)
判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading. ...
- winform判断程序是否运行,且只能运行一个实例
前言 判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种. 目前使用的是第一种方法. 方法1:线程互斥 static class Program { private static S ...
- C#让应用程序只运行一个实例的几种方法
一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...
- 如何用Qt写一个同一时间只能运行一个实例的应用程序
http://blog.sina.com.cn/s/blog_6343941a0100nk2x.html 可以达到的目的: 1.应用只启动一个实例,依赖于QtNetwork模块 2.启动时向另一个实例 ...
- Java程序只运行一个实例[转]
如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这 ...
- vc++高级班之窗口篇[4]---让程序只运行一个实例
大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...
- VC 实现程序只运行一个实例,并激活已运行的程序
转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...
- VC程序只运行一个实例,并在打开多个时激活原窗口
(一)单文档应用程序 1.在应用程序类C~~App::InitInstance()函数中判断是否已有一个应用程序实例正在运行 BOOL C~~App::InitInstance() { . ...
随机推荐
- 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- ios 类似微信红点显示功能
设计思路:给UIView增加一个分类 所有的视图都可以根据需要来进行红点显示 #import <UIKit/UIKit.h> @interface UIView (CHRRedDot) @ ...
- SSIS 包部署 Package Store 后,在 IS 中可以执行,AGENT 执行却报错
可以执行 SSIS Package ,证明用 SSIS Package 的账户是可以执行成功的.SQL Server Agent 默认指定账号是 Network Service. 那么可以尝试一下将 ...
- HTML 学习笔记 JQuery(DOM 操作2)
接着上一节的将,这一节从复制节点讲起 复制节点 继续使用之前的例子 如果单击<li>元素后 需要在复制一个<li>元素,可以使用clone()方法完成.全部代码如下 <h ...
- Linux学习日记-WCF RestFul的部署(三)
一.关于WCF 的部署 默认的wshttp风格的wcf是很容易部署上去的,但是这里给个建议尽量不要使用WCF的配置文件去部署尽管 我们都已经很熟悉了,在使用配置文件你会发现各种蛋疼的问题. 二.WCF ...
- jexus5.8.2 linux x64专业版 配置https
一.环境 1.jexus版本:Jexus/5.8.2.8 Linux专业版 内置mono版本:Mono/4.6.2.7 2.操作系统:centOs7 jexus独立版由于是免安装版并且内置mono,所 ...
- JS中给正则表达式加变量
前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下. 一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
前言 上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...
- ASP.NET MVC Model元数据(一)
ASP.NET MVC Model元数据(一) 前言 在我初学的时候对Model元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退 ...
- java 锁4
关于锁的分类 及 锁的灵活使用: 参见 http://blog.csdn.net/qaz13177_58_/article/details/21543515 有几句话说得相当不错: 锁的分类 : 同 ...