zoukankan      html  css  js  c++  java
  • 如何让应用程序仅运行一个实例(c#)

    主要的思想非常简单,就是检查当前运行的进程里是否有现在要启动的应用程序的进程名称,如果有,查找两个进程的exe文件路径是否相同,如果相同,则让已运行的进程作为当前运行进程即可!
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using System.Reflection; 
     [STAThread]
      static void Main()
      {
       //Application.Run(new UIForm());

                //得到正在运行的例程
                Process instance = RunningInstance();
                if (instance == null)
                {
                    //如果没有其它例程,就新建一个窗体
                    Application.Run(new UIForm());
                }
                else
                {
                    //处理发现的例程
                    HandleRunningInstance(instance);
                }

      }

            public static string GetMainPath(string strPath)
            {
                string[] ArrStr = strPath.Split('\\');

                string str = "";

                for (int i = 0; i < ArrStr.Length - 1; i++)
                {
                    str += ArrStr[i];
                }

                return str;
            }

            public static Process RunningInstance()
            {
                Process current = Process.GetCurrentProcess();
                Process[] processes = Process.GetProcessesByName("AsynchUI");

                //遍历正在有相同名字运行的例程
                foreach (Process process in processes)
                {
                    //忽略现有的例程
                    if (process.Id != current.Id)
                    {
                        //确保例程从EXE文件运行
                        if (GetMainPath(process.MainModule.FileName.Replace("/","\\")) ==
                          GetMainPath(Application.ExecutablePath.Replace("/", "\\")))
                        {
                            //返回另一个例程实例
                            return process;
                        }
                    }
                }

                //没有其它的例程,返回Null
                return null;
            }

            public static void HandleRunningInstance(Process instance)
            {
                //确保窗口没有被最小化或最大化
                ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);

                //设置真实例程为foreground window
                SetForegroundWindow(instance.MainWindowHandle);
            }

            [DllImport("User32.dll")]

            private static extern bool ShowWindowAsync(
              IntPtr hWnd, int cmdShow);
            [DllImport("User32.dll")]
            private static extern bool
            SetForegroundWindow(IntPtr hWnd);
            private const int WS_SHOWNORMAL = 1;

  • 相关阅读:
    HttpServletRequest对象,自己学习的心得。
    @PathVariable注解的使用和@Requestparam
    微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
    (转)ubuntu 14.04下安装hadoop2.6(伪分布式)
    数据库范式
    C与Python变量的区别
    python3获取当前目录(转)
    最大连续子数组积的线性解法
    最大子数组的线性解法
    windows7下python3.4.3 添加库路径(转)
  • 原文地址:https://www.cnblogs.com/wpf123/p/2052928.html
Copyright © 2011-2022 走看看