我有一个winforms应用程序,
单击关闭按钮,我将该应用程序隐藏到系统托盘中,就像skype的工作原理一样。
如果应用程序再次被实例化,并且该应用程序的实例已经在运行,那么我想将已经运行的应用程序(可能在托盘中)带到前面并退出新应用程序..
在Main
mathod中使用WCF我想到的是这样的事情
Process currentProcess = Process.GetCurrentProcess();
Process[] processes = Process.GetProcesses();
bool running = false;
foreach (var process in processes)
{
if (process.ProcessName == currentProcess.ProcessName
&& process.Id != currentProcess.Id)
{
running = true;
}
}
if (running)
{
ChannelFactory<IService1> pipeFactory = new
ChannelFactory<IService1>(new NetNamedPipeBinding(),
new EndpointAddress("net.pipe://localhost/PipeActivate"));
IService1 pipeProxy = pipeFactory.CreateChannel();
pipeProxy.ActivateThisWindow();
Application.Exit();
}
else
{
using (ServiceHost host = new
ServiceHost(typeof(Form1),
new Uri[] { new Uri("net.pipe://localhost") }))
{
host.AddServiceEndpoint(typeof(IService1),
new NetNamedPipeBinding(), "PipeActivate");
host.Open();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
host.Close();
}
}
,其中
void IService1.ActivateThisWindow()
{
this.Show();
if (this.WindowState != FormWindowState.Normal)
this.WindowState = FormWindowState.Normal;
this.Activate();
}
现在的问题是,它将正在运行的实例带到前面,但是当新实例退出时,它将进入以前的状态。
有什么问题?我该如何解决这个问题?
我可以用其他方式来达到这个要求吗?
答案 0 :(得分:2)
虽然这是一种非常新颖的方法,但它有点矫枉过正。有一种更容易和更广泛使用的方法来处理这个问题,如此处所示。
What is the correct way to create a single-instance application?
根据个人经验,我将这个资源用于我的所有单实例应用程序,它就像一个魅力。
答案 1 :(得分:1)
我认为你已经在Form 1类中实现了IService1.ActivateThisWindow,所以这种行为是因为为主机app上的每个请求创建了form1的新实例,并在请求结束时被销毁。要解决IService1.ActivateThisWindow在单独的类中的问题因素,因此form1不是宿主对象并使form1单例。