当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-23

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

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

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

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

代码如下:

static class Program
    {
        ///
        /// The main entry point for the application.
        ///
        [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());
        }

        ///
        /// 查看程序是否已经运行
        ///
        ///
        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;
        }

        ///
        /// 使程序前端显示
        ///
        ///
        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);
    }


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Nginx中禁止使用IP访问网站的配置实例
  • 请教高手:在java中如何禁止屏幕考屏及在jsp中禁止copy操作?
  • js禁止页面刷新 js禁止用F5键刷新 js禁止右键
  • 禁止apache显示目录索引的常见方法(apache禁止列目录)
  • 请问如何用iptables禁止一个IP地址范围
  • ldd3: 禁止了中断,是不是就没有系统滴答了?
  • 用iptables设定禁止ping 后,重启电脑后又会生效,
  • wince禁止程序标题栏上的退出按钮示例
  • apache禁止搜索引擎收录、网络爬虫采集的配置方法
  • FileUpload 控件禁止手动输入
  • 怎样在服务器上禁止访问某网站
  • Telnet 端口禁止,如何打开?
  • Android如何禁止横屏竖屏的变换
  • 为什么要限制我进入csdn(说我的ip被禁止进入)?
  • 如何禁止编辑文本框内的消息!谢谢!
  • Tomcat4中如何禁止目录浏览!
  • 禁止了根用户登录,现在后悔了
  • 怎样将Form里type为text 的input设为只能读不能写(禁止用户输入)?
  • 怎样禁止linux服务器的自动黑屏?
  • unix系统文件名中允许/禁止哪些字符?
  • 为什么我用 iptables 禁止不了一指定IP


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3