1

我有一个winforms应用程序,

单击关闭按钮时,我将该应用程序隐藏到系统托盘中,就像 Skype 的工作方式一样。

如果再次实例化应用程序并且该应用程序的实例已经在运行,那么我想将已经运行的应用程序(可能在托盘中)带到前面并退出新的应用程序..

Main我想在使用 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();
    }

现在的问题是,它将正在运行的实例放在前面,但是随着新实例的退出,它会回到以前的状态。

问题是什么?我该如何解决这个问题?

我可以使用哪些其他方法来实现此要求?

4

2 回答 2

2

虽然这是一种非常新颖的方法,但它有点矫枉过正。如这里所示,有一种更简单且使用更广泛的方法来处理此问题。

创建单实例应用程序的正确方法是什么?

从个人经验来看,我将这个资源用于我所有的单实例应用程序,它就像一个魅力。

于 2012-06-26T11:55:10.717 回答
1

我假设您已经在 Form 1 类中实现了 IService1.ActivateThisWindow,所以这种行为是因为 form1 的新实例正在为主机应用程序上的每个请求创建并在请求结束时被销毁。为了解决问题,将 IService1.ActivateThisWindow 放在单独的类中,使 form1 不是宿主对象并使 form1 成为单例。

于 2012-06-26T12:13:17.543 回答