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





    参考 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);      //放到前端
            }
        }
    }
    
  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/xe2011/p/12606308.html
Copyright © 2020-2023  润新知