簡體   English   中英

在應用程序的實例之間進行通信

[英]communicate between the instances of an application

我有一個winforms應用程序,

在關閉按鈕單擊,我將該應用程序隱藏到系統托盤中,就像Skype的工作方式一樣。

如果再次實例化應用程序並且該應用程序的實例已經在運行,那么我想將已經運行的應用程序(可能在托盤中)帶到前面並退出新應用程序。

我想做的就是在使用WCF的Main mathod中這樣做

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

現在的問題是,它將運行的實例帶到前面,但是當新實例退出時,它將進入其先前的狀態。

問題是什么? 我怎么解決這個問題?

我可以用什么方法來達到這個要求?

雖然這是一種非常新穎的方法,但它有點矯枉過正。 如此處所示,有一種更容易和更廣泛使用的方法來處理這個問題。

創建單實例應用程序的正確方法是什么?

從個人經驗來看,我將這個資源用於我的所有單實例應用程序,它就像一個魅力。

我假設你已經在Form 1類中實現了IService1.ActivateThisWindow,所以這種行為是因為在主機app上為每個請求創建了form1的新實例,並在請求結束時被銷毀。 要在單獨的類中解決問題因素IService1.ActivateThisWindow,因此form1不是主機對象並使form1單例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM