C# 禁止应用程序多次启动的实例

 更新时间:2013年09月06日 16:09:49   作者:  
经常我们会有这样的需求,只让应用程序运行一个实体,下面是实现的方法,有需要的朋友可以参考一下

通常我们的情况是,双击一个exe文件,就运行一个程序的实体,再双击一次这个exe文件,又运行这个应用程序的另一个实体。就拿QQ游戏来说吧,一台电脑上一般只能运行一个QQ游戏大厅(不过以前听说过有双开的外挂)。

那我们的程序也能像QQ游戏那里禁止多次启动吗,答案是可以的,下面介绍下一个简单的实现方法,那就是Mutex(互斥)。

      Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多个线程同步访问的一个类。它非常类似了Monitor类,因为他们都只有一个线程能拥有锁定。而操作系统能够识别有名称的互斥,我们可以给互斥一个唯一的名称,在程序启动之前加一个这样的互斥。这样每次程序启动之前,都会检查这个命名的互斥是否存在。如果存在,应用程序就退出。

复制代码 代码如下:

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool createdNew;
            //系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次
            //第二个参数可以设置为产品的名称:Application.ProductName

            //每次启动应用程序,都会验证名称为SingletonWinAppMutex的互斥是否存在
            Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);

            //如果已运行,则在前端显示
            //createdNew == false,说明程序已运行
            if (!createdNew)
            {
                Process instance = GetExistProcess();
                if (instance != null)
                {
                    SetForegroud(instance);
                    Application.Exit();
                    return;
                }
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }

        /// <summary>
        /// 查看程序是否已经运行
        /// </summary>
        /// <returns></returns>
        private static Process GetExistProcess()
        {
            Process currentProcess = Process.GetCurrentProcess();
            foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
            {
                if ((process.Id != currentProcess.Id) &&
                    (Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))
                {
                    return process;
                }
            }
            return null;
        }

        /// <summary>
        /// 使程序前端显示
        /// </summary>
        /// <param name="instance"></param>
        private static void SetForegroud(Process instance)
        {
            IntPtr mainFormHandle = instance.MainWindowHandle;
            if (mainFormHandle != IntPtr.Zero)
            {
                ShowWindowAsync(mainFormHandle, 1);
                SetForegroundWindow(mainFormHandle);
            }
        }

        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    }

相关文章

  • Winform消除button按下出现的虚线简单实现方法

    Winform消除button按下出现的虚线简单实现方法

    这篇文章主要介绍了Winform消除button按下出现的虚线简单实现方法,通过重写button设置Selectable参数实现该功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#内插字符串的简单使用

    C#内插字符串的简单使用

    这篇文章主要为大家详细介绍了C#内插字符串的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Unity实现打砖块游戏

    Unity实现打砖块游戏

    这篇文章主要为大家详细介绍了Unity实现打砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C#开发教程之FTP上传下载功能详解

    C#开发教程之FTP上传下载功能详解

    这篇文章主要为大家详细介绍了C#开发教程之FTP上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 使用C#开发OPC Server服务器源码解析

    使用C#开发OPC Server服务器源码解析

    OPC Server服务器服务器的开发比较繁琐,本示例采用C#提供了一种简单快速实现OPCServer的方法,已经在工程项目中应用,本文对C#开发OPC Server服务器相关知识给大家介绍的非常详细,需要的朋友参考下吧
    2022-06-06
  • C#实现快速查询文件的方法

    C#实现快速查询文件的方法

    这篇文章介绍了C#实现快速查询文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Unity3D Shader实现流光效果

    Unity3D Shader实现流光效果

    这篇文章主要为大家详细介绍了Unity3D Shader实现流光效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#基础知识之base关键字介绍

    C#基础知识之base关键字介绍

    本文主要介绍base关键字的使用方法,base关键字可以调用基类重写的方法,可以调用基类的构造方法,还可以在EntityFramework中使用,下面一一介绍。
    2016-04-04
  • C#遍历文件夹及其子目录的完整实现方法

    C#遍历文件夹及其子目录的完整实现方法

    这篇文章主要介绍了C#遍历文件夹及其子目录的方法,涉及C#文件与目录的基本操作技巧,简单实用,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 逐步讲解快速排序算法及C#版的实现示例

    逐步讲解快速排序算法及C#版的实现示例

    快速排序在时间复杂度同为O(N*logN)的几种排序方法中效率较高,因而比较常用,接下来这里就来逐步讲解快速排序算法及C#版的实现示例
    2016-06-06

最新评论