0

我用一种形式编写了一个简单的 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());
        }
    }
}
4

2 回答 2

2

.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 属性来获取从第二个实例传递到主实例的命令行参数。如果您使用文件关联,这往往很有用。

于 2013-01-14T20:42:26.530 回答
0

这是我能找到的做同样事情的帖子的最新版本。本质上,您获取其他流程信息,然后将其提交。

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

于 2013-01-14T19:14:28.830 回答