前言

在开发应用程序时,通常只让程序运行一个实例。所以,就要判断程序是否已经运行。

下面是我自己在项目中使用到,封装好的帮助类。有 普通的 C# 应用程序 和 Windows CE 和 Windows Mobile 应用程序使用的方法。

主要是通过 System.Threading.Mutex 类 和 Win32 API 来实现,下面就是各自的代码,调用示例在最后面。

普通 C# 应用程序

主要是 Windows 窗体应用程序和控制台程序。

1. 使用 System.Threading.Mutex 类

参考:Mutex 类(System.Threading)

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的更多相关文章

  1. 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.网络监听配置 ...

  2. C# WINFORM判断程序是否运行,且只能运行一个实例(转)

    判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading. ...

  3. winform判断程序是否运行,且只能运行一个实例

    前言 判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种. 目前使用的是第一种方法. 方法1:线程互斥 static class Program { private static S ...

  4. C#让应用程序只运行一个实例的几种方法

    一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...

  5. 如何用Qt写一个同一时间只能运行一个实例的应用程序

    http://blog.sina.com.cn/s/blog_6343941a0100nk2x.html 可以达到的目的: 1.应用只启动一个实例,依赖于QtNetwork模块 2.启动时向另一个实例 ...

  6. Java程序只运行一个实例[转]

    如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这 ...

  7. vc++高级班之窗口篇[4]---让程序只运行一个实例

      大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...

  8. VC 实现程序只运行一个实例,并激活已运行的程序

    转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...

  9. VC程序只运行一个实例,并在打开多个时激活原窗口

    (一)单文档应用程序   1.在应用程序类C~~App::InitInstance()函数中判断是否已有一个应用程序实例正在运行 BOOL C~~App::InitInstance() {     . ...

随机推荐

  1. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面

    DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...

  2. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  3. .NET CoreCLR开发人员指南(上)

    1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比,CLR代码库有很多而且比较成熟的代码调试工具去检测BUG.对于程序员来说,理解这些规则和习惯写法非常的重要. 这篇文章让所 ...

  4. Java进击C#——前言

    本章简言 记得三年前笔者来到现在的公司的时候,公司人口不出十个人.那个时候笔者刚从日本回来,想在福州.厦门.青岛找一个合适自己发展的机会.最后我的一个福州的朋友打电话希望我能过去帮他,跟他一起创业.这 ...

  5. RabbitMQ + PHP (三)案例演示

    今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...

  6. jQuery radio的取值与赋值

    取值: $("input[name='radioName']:checked").val(); 赋值: $("input[name='radioName'][value= ...

  7. Firefox开发者专版浏览器,Web开发者利器.

    2015的11月9日,Firefox迎来了自己的十周岁生日.在庆祝Firefox十周年之际,Mozilla发布了Firefox开发者专版,这是首款专门为开发者打造的浏览器. 浏览器中独特的暗色调设计. ...

  8. 技术笔记:Delphi多线程应用读写锁

    在多线程应用中锁是一个很简单又很复杂的技术,之所以要用到锁是因为在多进程/线程环境下,一段代码可能会被同时访问到,如果这段代码涉及到了共享资源(数据)就需要保证数据的正确性.也就是所谓的线程安全.之前 ...

  9. 您真的理解了SQLSERVER的日志链了吗?

    您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...

  10. 云计算之路-阿里云上:“黑色1秒”最新线索——w3tp与w3dt

    向大家分享一下最近排查“黑色1秒”问题的进展,“黑色1秒”的问题表现详见什么是黑色1秒. 1. 发生在w3wp进程内 判断依据:“黑色1秒”期间,http.sys的HTTP Service Reque ...