.net 桌面端程序 保证只启动一个进程实例

1 创建wcf进程服务

        public static IOperateSevice GetSevice()
        {
            NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
            binding.MaxReceivedMessageSize = 2147483647;
            binding.CloseTimeout = TimeSpan.FromMinutes(3);
            binding.OpenTimeout = TimeSpan.FromMinutes(3);
            binding.ReceiveTimeout = TimeSpan.FromMinutes(3);
            binding.SendTimeout = TimeSpan.FromMinutes(3);
            EndpointAddress addr = new EndpointAddress("net.pipe://localhost/Client/WCFSevice");
//   创建一个指定类型的通道,该通道用于将消息发送到用指定绑定进行配置的服务终结点。
            ChannelFactory<IOperateSevice> cf = new ChannelFactory<IOperateSevice>(binding, addr); 
            return cf.CreateChannel();
        }

2  进程启动后保存当前窗口句柄

  WcfServer.GetSevice().SaveIEBarHandle(this.Handle);

3 获取当前进程的名称

 string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;

4 查找当前电脑所有此名称的进程

   System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName(strProcessName);

5 判断是否大于1个,大于1个,杀死多余线程,或者显示之前关闭的窗口

 if (ps.Length > 1)
            {
 
            }

6 判断wcf服务是否含有窗口句柄,已经含有就展示之前进程的窗口

 IntPtr handle = WcfServer.GetSevice().GetClientHandle();
                    if (handle != IntPtr.Zero)
                    {
                        WindowsApi.ShowWindow(handle, 1);
                        return;
                    }

7 否则杀死多余进程

  foreach (var p in ps)
                        {
                            if (p.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
                                p.Kill();
                        }

8 通过句柄展示窗口方法


        [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]         //显示窗口
        public static extern IntPtr ShowWindow(IntPtr hwnd, int nCmdShow);

完整代码

    /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] Args)
        {
            //检查是否在运行,保证每次只运行一个实例
            string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
            System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName(strProcessName);
          
            if (ps.Length > 1)
            {
                try
                {
                    IntPtr handle = WcfServer.GetSevice().GetHandle();
                    if (handle != IntPtr.Zero)
                    {
                        WindowsApi.ShowWindow(handle, 1);
                        return;
                    }
                    else
                    {
                        foreach (var p in ps)
                        {
                            if (p.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
                                p.Kill();
                        }
                    }
                }
                catch
                {
                    foreach (var p in ps)
                    {
                        if (p.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
                            p.Kill();
                    }
                }
            }
 
            Application.Run(new Login()); 

        }

猜你喜欢

转载自blog.csdn.net/qq_25744257/article/details/83895535