首页 > 代码库 > 禁止程序多次运行

禁止程序多次运行



 


前言


 在做机房收费系统中又考虑到一个问题,我最后打包后的应用程序如果多次打开又会出现怎么样的情形呢?果不其然,竟然出现多个程序的画面。如果用户没有关闭当前运行的应用程序,又打开同样的程序的话,那么由于两个程序占用同一个端口,这时就会产生错误。下面就用两种方法为大家介绍下如何避免这种问题的发生。


 


  方法一:使用互斥量禁止程序运行多次


 源代码

 private void Frm_Main_Load(object sender, EventArgs e)
        {
            bool Exist;//定义一个bool变量,用来表示是否已经运行
            //创建Mutex互斥对象
            System.Threading.Mutex newMutex = new System.Threading.Mutex(true,"仅一次",out Exist);
            if (Exist)//如果没有运行
            {
                newMutex.ReleaseMutex();//运行新窗体
            }
            else
            {
                MessageBox.Show("本程序一次只能运行一个实例!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);//弹出提示信息
                this.Close();//关闭当前窗体
            }
        }

 关键技术


                    Mutex类:表示一个同步基元,也可用于进程间同步。


 语法如下:


                    Public Mutex(boolinitiallyOwned,string name,out bool createdNew)


 


参数说明


  1. initiallyOwned:如果为True,则给予调用线程已命名的系统互斥体的初始所属权。

  2. NameMutex的名称,如果未NULL,则Mutex使未命名的。

  3. createdNew:在该方法返回时,如果创建了局部互斥体或指定的命名系统互斥体,则包含布尔值true;如果指定的命名系统互斥体已存在,在为False

    4.         ReleaseMutex方法:用来释放Mutex对象


 


说明:Mutex类位于System.Threading命名空间下


 


 


方法二:使用进程名禁止程序多次运行


         通过判断进程名来实现禁止程序运行多次


      


源代码

 private void Frm_Main_Load(object sender, EventArgs e)
        {
            bool Exist;//定义一个bool变量,用来表示是否已经运行
            //创建Mutex互斥对象
            System.Threading.Mutex newMutex = new System.Threading.Mutex(true,"仅一次",out Exist);
            if (Exist)//如果没有运行
            {
                newMutex.ReleaseMutex();//运行新窗体
            }
            else
            {
                MessageBox.Show("本程序一次只能运行一个实例!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);//弹出提示信息
                this.Close();//关闭当前窗体
            }
        }

关键技术


      1.Path类的GetFileNameWithoutExtension方法


                           该方法用来返回不具有扩展名的指定路径字符串的文件名


      语法规则


             Public static string GetFileNameWithoutExtension(stringpath)


      参数说明


  1. Path:文件路径

  2. 返回值:包含由GetFileName返回的字符串string


 


2Process类的GetProcessesByName方法


用来创建新的Process组件的数组,并将它们与共享指定的进程名称的所有现有进程资源关联。


  语法规则


  Public static Process[] GetProcessesByName(stringprocessName)


 参数说明


  1. processname:进程的友好名称

  2. 返回值:Process类型的数组,表示运行指定应用程序或文件的进程资源。


小结:


方法一是通过一个Mutex类来创建一个互斥的量的应用程序,然后通过判断应用程序是否已经打开,如果打开的话,则关闭现有的应用程序;方法二则是通过Path类来先得到应用程序的运行路径,然后根据路径来创建相应的应用程序数组,最后通过数组长度来来判断当前打开的应用程序的实例,如果数组值大于1的话,则给出提示。