激活单实例应用程序的主要形式

时间:2008-09-09 13:35:11

标签: c# .net winforms

在C#Windows窗体应用程序中,我想检测应用程序的另一个实例是否已在运行。 如果是,请激活正在运行的实例的主窗体并退出此实例。

实现这一目标的最佳方法是什么?

4 个答案:

答案 0 :(得分:8)

Scott Hanselman answers详细询问您。

答案 1 :(得分:4)

以下是我目前在应用程序的Program.cs文件中所做的事情。

// Sets the window to be foreground
[DllImport("User32")]
private static extern int SetForegroundWindow(IntPtr hwnd);

// Activate or minimize a window
[DllImportAttribute("User32.DLL")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_RESTORE = 9;

static void Main()
{
    try
    {
        // If another instance is already running, activate it and exit
        Process currentProc = Process.GetCurrentProcess();
        foreach (Process proc in Process.GetProcessesByName(currentProc.ProcessName))
        {
            if (proc.Id != currentProc.Id)
            {
                ShowWindow(proc.MainWindowHandle, SW_RESTORE);
                SetForegroundWindow(proc.MainWindowHandle);
                return;   // Exit application
            }
        }


        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
    catch (Exception ex)
    {
    }
}

答案 2 :(得分:3)

您可以使用此类检测并在其后激活您的实例:

        // Detect existing instances
        string processName = Process.GetCurrentProcess().ProcessName;
        Process[] instances = Process.GetProcessesByName(processName);
        if (instances.Length > 1)
        {
            MessageBox.Show("Only one running instance of application is allowed");
            Process.GetCurrentProcess().Kill();
            return;
        }
        // End of detection

答案 3 :(得分:0)

Aku,这是一个很好的资源。我回答了一个与此类似的问题。您可以查看我的answer here。尽管这是针对WPF的,但您可以在WinForms中使用相同的逻辑。