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());
}