0

やあ、

バックグラウンドで実行されている WinForm アプリケーション (app1) があり、別のアプリケーション (app2) (最上位のアクティブなアプリケーション) が app1 で startProcess をトリガーするとします。

ここで、app1 が既存のインスタンスを使用し、それを最上位のアプリケーション (app1 アプリケーション内だけでなく) に移動する必要があります。

私はこれを見つけました: http://sanity-free.org/143/csharp_dotnet_single_instance_application.html

APIなしではこれを行うことができないというのは本当ですか? 私は、bringToFront、Activate、および Focus を調べましたが、これらはすべて、アプリケーション間ではなく、アプリケーション内でのみ効果があるように見えますか?

4

2 に答える 2

2

「APIなし」の意味や、それが重要な理由がわかりません。

ただし、最も簡単な方法は経由WindowsFormsApplicationBaseです。ほんの数行のコードで、必要なものがすべて提供されます。

アセンブリへの参照を追加する必要がありますが、Microsoft.VisualBasicC# で使用できます。

このクラスを作成します。

public class SingleInstanceApplication : WindowsFormsApplicationBase
{
    private SingleInstanceApplication()
    {
        IsSingleInstance = true;
    }

    public static void Run(Form form)
    {
        var app = new SingleInstanceApplication
        {
            MainForm = form
        };

        app.StartupNextInstance += (s, e) => e.BringToForeground = true;

        app.Run(Environment.GetCommandLineArgs());
    }
}

Program.cs で、それを使用するように実行行を変更します。

//Application.Run(new Form1());
SingleInstanceApplication.Run(new Form1());
于 2012-05-11T08:16:54.180 に答える
0

2 つのアプリ間でなんらかの通信が本当に必要です。投稿された通信への記事リンクは、WinApi メッセージを介して行われます。また、ソケットを介して、またはファイルと FileWatchers を介して行うこともできます。

UPD1: 別のアプリからのタイマー シミュレーション メッセージで最小化をシミュレートし、そのメッセージで最大化するコード:

public partial class Form1 : Form
{
    private Timer _timer = null;

    public Form1()
    {
        InitializeComponent();

        this.Load += OnFormLoad;
    }

    private void OnFormLoad(object sender, EventArgs e)
    {
        Button btn = new Button();
        btn.Text = "Hide and top most on timer";
        btn.Width = 200;
        btn.Click += OnButtonClick;

        this.Controls.Add(btn);
    }

    private void OnButtonClick(object sender, EventArgs e)
    {
        //minimize app to task bar
        WindowState = FormWindowState.Minimized;

        //timer to simulate message from another app
        _timer = new Timer();
        //time after wich form will be maximize
        _timer.Interval = 2000;
        _timer.Tick += new EventHandler(OnTimerTick);
        _timer.Start();
    }

    private void OnTimerTick(object sender, EventArgs e)
    {
        _timer.Stop();

        //message from another app came - we should 
        WindowState = FormWindowState.Normal;
        TopMost = true;
    }
}
于 2012-05-11T08:25:43.317 に答える