首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 正文

基于.Net平台唯一运行实例C#代码实现

作者:郑佐
时间: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;
            //
获取进程名为ProcessNameProcess数组。
            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);
            }
        } 

 

[1] [2] 下一页

【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航