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

フォーム1クラスにIService1.ActivateThisWindowを実装したと思います。したがって、この動作は、フォーム1の新しいインスタンスがホストアプリのリクエストごとに作成され、リクエストが終了すると破棄されるためです。問題を解決するには、別のクラスのIService1.ActivateThisWindowを使用して、form1がホストオブジェクトではなく、form1をシングルトンにします。

于 2012-06-26T12:13:17.543 に答える