扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月10日
关键字: 编程
作者:郑佐
时间:2006-7-2
概述
本文是针对《基于.Net平台应用程序唯一运行实例实现》的补充,文章给出功能实现代码,其中SingleInstance类实现只允许一个实例运行,Program为测试主程序入口。在代码中标识说明文字。
主要代码
SingleInstance.cs文件,
using System;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Reflection;
using System.Runtime.InteropServices;
/*------------------------------------------------
郑佐 2006-07-01 http://blog.csdn.net/zhzuo
--------------------------------------------------*/
namespace Zhengzuo.CSharpCode
{
/// <summary>
/// 只启动一个应用程序实例控制类
/// </summary>
public static class SingleInstance
{
private const int WS_SHOWNORMAL = 1;
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
//标志文件名称
private static string runFlagFullname = null;
//声明同步基元
private static Mutex mutex = null;
/// <summary>
/// static Constructor
/// </summary>
static SingleInstance()
{
}
#region api实现
/// <summary>
/// 获取应用程序进程实例,如果没有匹配进程,返回Null
/// </summary>
/// <returns>返回当前Process实例</returns>
public static Process GetRunningInstance()
{
Process currentProcess = Process.GetCurrentProcess();//获取当前进程
//获取当前运行程序完全限定名
string currentFileName = currentProcess.MainModule.FileName;
//获取进程名为ProcessName的Process数组。
Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName);
//遍历有相同进程名称正在运行的进程
foreach (Process process in processes)
{
if (process.MainModule.FileName == currentFileName)
{
if (process.Id != currentProcess.Id)//根据进程ID排除当前进程
return process;//返回已运行的进程实例
}
}
return null;
}
/// <summary>
/// 获取应用程序句柄,设置应用程序前台运行,并返回bool值
/// </summary>
public static bool HandleRunningInstance(Process instance)
{
//确保窗口没有被最小化或最大化
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
//设置真实例程为foreground window
return SetForegroundWindow(instance.MainWindowHandle);
}
/// <summary>
/// 获取窗口句柄,设置应用程序前台运行,并返回bool值,重载方法
/// </summary>
/// <returns></returns>
public static bool HandleRunningInstance()
{
Process p = GetRunningInstance();
if (p != null)
{
HandleRunningInstance(p);
return true;
}
return false;
}
#endregion
#region Mutex实现
/// <summary>
/// 创建应用程序进程Mutex
/// </summary>
/// <returns>返回创建结果,true表示创建成功,false创建失败。</returns>
public static bool CreateMutex()
{
return CreateMutex(Assembly.GetEntryAssembly().FullName);
}
/// <summary>
/// 创建应用程序进程Mutex
/// </summary>
/// <param name="name">Mutex名称</param>
/// <returns>返回创建结果,true表示创建成功,false创建失败。</returns>
public static bool CreateMutex(string name)
{
bool result = false;
mutex = new Mutex(true, name, out result);
return result;
}
/// <summary>
/// 释放Mutex
/// </summary>
public static void ReleaseMutex()
{
if (mutex != null)
{
mutex.Close();
}
}
#endregion
#region 设置标志实现
/// <summary>
/// 初始化程序运行标志,如果设置成功,返回true,已经设置返回false,设置失败将抛出异常
/// </summary>
/// <returns>返回设置结果</returns>
public static bool InitRunFlag()
{
if (File.Exists(RunFlag))
{
return false;
}
using (FileStream fs = new FileStream(RunFlag, FileMode.Create))
{
}
return true;
}
/// <summary>
/// 释放初始化程序运行标志,如果释放失败将抛出异常
/// </summary>
public static void DisposeRunFlag()
{
if (File.Exists(RunFlag))
{
File.Delete(RunFlag);
}
}
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者