• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C# 禁止应用程序多次启动的实例

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#窗体应用程序实例,c#web应用程序实例,c#应用程序实例,c#应用实例,c#窗体应用实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

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

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

            //每次启动应用程序,都会验证名称为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);
    }
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#窗体全屏功能实例代码
  • C#窗体布局方式详解
  • C#处理猜拳问题的简单实例(非窗体)
  • C#非矩形窗体实现方法
  • C#通过反射打开相应窗体方法分享
  • C#选择法排序实例分析
  • C#使用动态规划解决0-1背包问题实例分析
  • C#插入法排序算法实例分析
  • C#窗体显示留言时间的方法
  • C#入门之窗体的简单用法实例

相关文章

  • 2017-05-28.NET连接MongoDB数据库实例教程
  • 2017-05-28c#获取数组中最大数的值
  • 2017-05-28C#往线程里传递参数的方法小结
  • 2017-05-28C#实现winform用子窗体刷新父窗体及子窗体改变父窗体控件值的方法
  • 2017-05-28C#实现查杀本地与远程进程的方法
  • 2017-05-28C#TreeView 无限级别分类实现方法
  • 2017-05-28C# 获取系统进程的用户名
  • 2017-05-28C#实现的鼠标钩子
  • 2017-05-28C# 递归查找树状目录实现方法
  • 2017-05-28C#词法分析器之词法分析的使用详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#多线程学习之(五)使用定时器进行多线程的自动管理
    • C# 检索不区分大小写并高亮显示实例详解
    • C#学习笔记- 随机函数Random()的用法详解
    • C#中DataBindings用法实例分析
    • 日常收集C#接口知识(知识全面)
    • WPF实现时钟特效
    • 快速解决owin返回json字符串多带了双引号"多了重string转义字符串
    • Winform学生信息管理系统登陆窗体设计(1)
    • c# 服务器上传木马监控代码(包含可疑文件)
    • C#函数式编程中的缓存技术详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有