【问题标题】:How to bring the main Form to top when trying to run a second Instance of the application尝试运行应用程序的第二个实例时如何将主窗体置于顶部
【发布时间】:2013-01-14 18:51:37
【问题描述】:

我用一个表单编写了一个简单的 Windows 应用程序。它的目的是只在一个实例中运行。我使用互斥锁方法并在第二个实例尝试运行时抛出一条消息。现在我想更改此消息框,并且我只想在尝试触发第二个实例时将第一个实例置于顶部。我的代码目前是:

namespace WindowsFormsApplication2
{
    static class Program
    {

        [STAThread]                
        static void Main()
        {


            bool mutexCreated = false;
            System.Threading.Mutex mutex = new System.Threading.Mutex(true,@"Local\WindowsFormsApplication2.WindowsFormsApplication2.exe", out mutexCreated);

           if(!mutexCreated )  
           {
               if( MessageBox.Show("The application is already running.Hit the OK to exit",             "",MessageBoxButtons.OK, MessageBoxIcon.Information ) != DialogResult.Cancel )
               {
                  mutex.Close(); 
                  return;
               }
           }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

【问题讨论】:

  • 您可以尝试仅激活 Form1 吗?
  • 嘿小丑。此举背后的要点是应用程序只能在一个实例中运行,但每当用户尝试触发另一个实例时,第一个实例表单会跳到顶部,而第二个实例会被取消。例如 - notepad++ 就是这样工作的,当尝试打开它两次时,预先打开的窗口不会打开另一个窗口,而是弹出到顶部。

标签: c#


【解决方案1】:

.NET 已经对此提供了很好的支持,既支持单实例应用程序,又让第一个应用程序知道另一个实例正在启动。强烈赞成这个而不是自己旋转。使用 WindowsFormsApplicationBase 类,像这样修改 Program.cs 文件:

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;    // Add reference to Microsoft.VisualBasic

namespace WindowsFormsApplication1 {
    class Program : WindowsFormsApplicationBase {
        public Program() {
            this.EnableVisualStyles = true;
            this.IsSingleInstance = true;
            this.MainForm = new Form1();
        }
        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs e) {
            e.BringToForeground = true;
        }
        [STAThread]
        public static void Main(string[] args) {
            new Program().Run(args);
        }
    }
}

注意 OnStartupNextInstance() 方法如何确保将主窗口带回前台。您还可以使用它的 e.CommandLine 属性来获取从第二个实例传递到主实例的命令行参数。如果您使用文件关联,这往往很有用。

【讨论】:

    【解决方案2】:

    这是我能找到的具有相同功能的帖子的最新版本。本质上,您获取其他进程信息,然后将其提交。

    http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/42b3db75-e61e-4f59-bf2b-c96a40cfb4e4

    【讨论】:

    • 我实际上想替换这个块: if(!mutexCreated ) { if( MessageBox.Show("应用程序已经在运行。点击确定退出", "",MessageBoxButtons.OK, MessageBoxIcon .Information ) != DialogResult.Cancel ) { mutex.Close();返回;使用将第一个实例置于顶部而不是打开新实例的代码。
    • 没错,所以使用附加的链接将焦点转移到已经运行的进程上。由于这将是第二个实例,因此它将是另一个进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多