只启动一个应用程序实例控制类

本文介绍了一个C#程序设计,用于确保应用程序仅运行一个实例。通过使用Mutex和文件标志的方法来防止重复启动,同时提供了如何获取并激活已运行实例的详细步骤。
using System;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Reflection;
using System.Runtime.InteropServices;

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()
        
{
        }


        
api实现#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



        
Mutex实现#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);
            }

        }



        
/**//// <summary>
        
/// 获取或设置程序运行标志,必须符合Windows文件命名规范
        
/// 这里实现生成临时文件为依据,如果修改成设置注册表,那就不需要符合文件命名规范。
        
/// </summary>

        public static string RunFlag
        
{

            
get
            
{
                
if (runFlagFullname == null)
                
{
                    
string assemblyFullName = Assembly.GetEntryAssembly().FullName;
                    
//CommonApplicationData://"C:\\Documents and Settings\\All Users\\Application Data"
                    string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
                    
//"C:\\Program Files\\Common Files"
                    
//string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles);
                    runFlagFullname = Path.Combine(path, assemblyFullName);
                }

                
return runFlagFullname;
            }

            
set
            
{
                runFlagFullname 
= value;
            }

        }

        
#endregion

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值