0

你好,

假设我们在后台运行了一个 WinForm 应用程序(app1),现在另一个应用程序(app2)(最上面的活动应用程序)触发了一个带有 app1 的 startProcess。

现在我需要 app1 使用现有实例并将其带到最顶层的应用程序(不仅在 app1 应用程序内)。

我发现了这个:http ://sanity-free.org/143/csharp_dotnet_single_instance_application.html

没有API就不可能做到这一点,这是真的吗?我看过 att BringToFront、Activate 和 Focus,但所有这些似乎只在应用程序内有效,而不在应用程序之间有效?

4

2 回答 2

2

我不知道您的意思是“没有 API”或为什么这很重要。

然而,最简单的方法是 via WindowsFormsApplicationBase。只需几行代码,它就可以为您提供所需的一切。

您需要添加对Microsoft.VisualBasic程序集的引用 - 但它可以通过 C# 使用。

制作这个类:

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 回答