程序的唯一性

来源:互联网 发布:windows server 功能 编辑:程序博客网 时间:2024/04/29 10:15

试过各种方法,下面这个相对比较好

在Program.cs中,添加如下,红色字部分要改掉

 

usingSystem.Diagnostics;  //添加

 

namespace ProgramUnique

{

   static class Program

   {

       /// <summary>

       /// 应用程序的主入口点。

       /// </summary>

       [STAThread]

       static void Main()

       {

           Process p = Form1.GetRunningInstance();

           if (p != null) //已经有应用程序副本执行

           {

             // MessageBox.Show("程序已经运行!");

               Form1.HandleRunningInstance();

           }

           else //启动第一个应用程序

           {

               RunApplication();

           }

       }

       static void RunApplication()

       {

           Application.EnableVisualStyles();

           Application.Run(new Form1());

       }

   }

}

 

 

在Form1.cs中添加这个region即可

 

       #region 程序唯一性

       private const int WS_SHOWNORMAL = 1;

       [DllImport("User32.dll")]

       private static extern bool ShowWindowAsync(IntPtr hWnd,int cmdShow);

       [DllImport("User32.dll")]

       private static extern bool SetForegroundWindow(IntPtrhWnd);

       public static Process GetRunningInstance()

       {

           Process currentProcess =Process.GetCurrentProcess();//获取当前进程

            //获取当前运行程序完全限定名

            stringcurrentFileName = currentProcess.MainModule.FileName;

           //获取进程名为ProcessName的Process数组。

           Process[] processes =Process.GetProcessesByName(currentProcess.ProcessName);

            //遍历有相同进程名称正在运行的进程

            foreach(Process process in processes)

           {

               if(process.MainModule.FileName == currentFileName)

               {

                   if (process.Id!= currentProcess.Id)//根据进程ID排除当前进程

                      return process;//返回已运行的进程实例

               }

           }

           return null;

       }

       public static bool HandleRunningInstance(Process instance)

       {

            //确保窗口没有被最小化或最大化

            ShowWindowAsync(instance.MainWindowHandle,WS_SHOWNORMAL);

           //设置真实例程为foreground window

           returnSetForegroundWindow(instance.MainWindowHandle);

       }

       public static bool HandleRunningInstance()

       {

           Process p = GetRunningInstance();

           if (p != null)

           {

               HandleRunningInstance(p);

               return true;

           }

           return false;

       }

       #endregion

0 0
原创粉丝点击