zoukankan      html  css  js  c++  java
  • C#关于一个程序,只可以有一种实例的方法

    方法一:
    使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.
    把program.cs文件里的Main()函数改为如下代码:

    说明:程序中通过语句 System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone);来创建一个互斥体变量run,其中"single_test"为互斥体名,在此方法返回时,如果创建了局部互斥体或指定的命名系统互斥体,则布尔值runone为true;如果指定的命名系统互斥体已存在,则为 false。已命名的互斥体是系统范围的。
    方法二:采用判断进程的方式,我们在运行程序前,查找进程中是否有同名的进程,同时运行位置也相同程,如是没有运行该程序,如果有就就不运行.在C#中应用System.Diagnostics名字空间中的Process类来实现,

    方法三:全局原子法,创建程序前,先检查全局原子表中看是否存在特定原子A(创建时添加的),存在时停止创建,说明该程序已运行了一个实例;不存在则运行程序并想全局原子表中添加特定原子A;退出程序时要记得释放特定的原子A哦,不然要到关机才会释放。

    原文地址:http://www.jb51.net/article/37073.htm

    文章地址:C#winform判断程序已经运,且只能运行一个实例

                 C# WINFORM判断程序是否运行,且只能运行一个实例(写的比较清楚)

    记录另外一个方法:

    /// <summary>
            /// 互斥实例
            /// </summary>
            private Mutex m_mt           = null;
     
    /// <summary>
            /// 标识是否一个实例已经运行
            /// </summary>
            private bool m_bIsRun        = false;
     
    /// <summary>
            /// 
            /// </summary>
            /// <param name="lpClassName"></param>
            /// <param name="lpWindowName"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "FindWindow")]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
     
     
            /// <summary>
            /// 
            /// </summary>
            /// <param name="hwnd"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
            public static extern IntPtr SetForegroundWindow(IntPtr hwnd);
     
    /// <summary>
            /// 构造函数
            /// </summary>
            public frm_Login()
            {
                try
                {               
                    this.MutexRun();
                }
                catch (Exception me)
                {                
                    DevExpress.XtraEditors.XtraMessageBox.Show(me.Message);                
                }
                InitializeComponent();
            }
     
            #endregion
     
            #region -初始化提取信息
     
            /// <summary>
            /// 单实例设置
            /// </summary>
            private void MutexRun()
            {
                bool bRun;
                m_mt = new Mutex(true, "TestRun", out bRun);
                if (!bRun)
                {
                    //检查当前程序是否运行,如果已经运行则设置为前端显示提醒用户
                    IntPtr Hander = CommonGenerator.FindWindow(null, "你的程序窗口标题");
                    if (Hander != IntPtr.Zero)
                    {
                        CommonGenerator.SetForegroundWindow(Hander);
                    }
                    m_mt.Close();
                    Environment.Exit(1);
                    return;
                }
            }
    

      

  • 相关阅读:
    MySQL聚集索引和非聚集索引
    如何避免表单重复提交
    i++为什么是线程不安全的
    TIME_WAIT和CLOSE_WAIT
    TCP三次握手四次挥手
    get和post区别
    Session存储
    Session和Cookie的区别和联系
    Servlet与线程安全
    AQS
  • 原文地址:https://www.cnblogs.com/AiYaTou/p/5102934.html
Copyright © 2011-2022 走看看