zoukankan      html  css  js  c++  java
  • 只能运行一个实例_单开 如果程序已打开再启动则显示当前的主程序




    参考 https://www.jb51.net/article/75156.htm



    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using System.Reflection;
    
    
    namespace System
    {
        /*
         *  只能运行一个实例_单开_
         *  参考 https://www.jb51.net/article/75156.htm
         *
         *
         *  使用方法 直接替换
    
            static void Main() {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                System.Diagnostics.Process p = OneAppStartup.GetInstance;
                if (p == null) {
    
                   //目标程序
                    Form1 frm = new Form1();
                    Application.Run(new Form1());
    
                } else {
                    OneAppStartup.ShowInstance(p);
                }
            }
    
         *
         *
         */
        class OneAppStartup
        {
            /// <summary>
            /// 该函数设置由不同线程产生的窗口的显示状态。
            /// </summary>
            /// <param name="hWnd">窗口句柄</param>
            /// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分。</param>
            /// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零。</returns>
            [DllImport("User32.dll")]
            private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
            /// <summary>
            /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
            /// </summary>
            /// <param name="hWnd">将被激活并被调入前台的窗口句柄。</param>
            /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。</returns>
            [DllImport("User32.dll")]
            private static extern bool SetForegroundWindow(IntPtr hWnd);
            private const int WS_SHOWNORMAL = 1;
    
    
            /// <summary>
            /// 获取正在运行的实例,没有运行的实例返回null;
            /// </summary>
            public static Process GetInstance
            {
                get {
                    Process current = Process.GetCurrentProcess();
                    Process[] processes = Process.GetProcessesByName(current.ProcessName);
                    foreach (Process process in processes) {
                        if (process.Id != current.Id) {
                            if (Assembly.GetExecutingAssembly().Location.Replace("/","\") == current.MainModule.FileName) {
                                return process;
                            }
                        }
                    }
                    return null;
                }
    
            }
    
            /// <summary>
            /// 显示已运行的程序。
            /// </summary>
            public static void ShowInstance(Process instance)
            {
                ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); //显示,可以注释掉
                SetForegroundWindow(instance.MainWindowHandle);      //放到前端
            }
        }
    }
    
  • 相关阅读:
    解题:NOI 2007 社交网络
    解题:2018九省联考 一双木棋
    125. 背包问题 II
    152. 组合
    140. 快速幂
    148. 颜色分类
    144. 交错正负数
    83. 落单的数 II
    124. 最长连续序列
    59. 最接近的三数之和
  • 原文地址:https://www.cnblogs.com/xe2011/p/12606308.html
Copyright © 2011-2022 走看看