Não permitir 2 instâncias do projeto

<< Click to Display Table of Contents >>

Navigation:  Desktop > Projeto >

Não permitir 2 instâncias do projeto

Previous pageReturn to chapter overviewNext page

using System;

using System.Windows.Forms;

using System.Diagnostics;

using System.Runtime.InteropServices;

using System.Reflection;

 

namespace WindowsFormsApplication11

{

    static class Program

    {

        [STAThread]

        public static void Main()

        {

            // pegar a instancia que está rodando

            Process instance = RunningInstance();

            if (instance == null)

            {

                // não tem instancia, então roda o programa

                Application.Run (new Form());

            }

            else

            {

                // existe outra instancia para esse projeto (então foca-a)

                HandleRunningInstance(instance);

            }

        }

 

        // rotina que procura uma instancia para o projeto (processo) atual

        public static Process RunningInstance()

        {

            Process current = Process.GetCurrentProcess();

            Process[] processes = Process.GetProcessesByName(current.ProcessName);

 

            // procura até achar um processo com mesmo nome do CurrentProcess

            foreach (Process process in processes)

            {

                // ignora se for "eu mesmo"

                if (process.Id != current.Id)

                {

                    // se o nome do EXE for o mesmo, então achamos o mesmo processo!

                    if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==

                        current.MainModule.FileName)

                    {

                        // retorna a instancia deste outro proceso

                        return process;

                    }

                }

            }

 

            // chegou até aqui não achou nada, então é null

            return null;

        }

    

        public static void HandleRunningInstance(Process instance)

        {

            // isto restaura a janela de sua condição minimizada ou maximizada

            ShowWindowAsync(instance.MainWindowHandle , WS_SHOWNORMAL);

 

            // "puxa" a instância para "cima"

            SetForegroundWindow(instance.MainWindowHandle);

        }

 

        // declaração de funções das DLLs do Windows

        [DllImport("User32.dll")]

        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

 

        [DllImport("User32.dll")] private static extern bool

        SetForegroundWindow(IntPtr hWnd); 

 

        private const int WS_SHOWNORMAL = 1;

    }

 }

 

 


 

Exemplo 2

 

using System; 

using System.Diagnostics; 

using System.Windows.Forms;

 

namespace UnicaInstancia 

{ 

  static class Program 

  { 

    /// <summary> 

    /// The main entry point for the application. 

    /// </summary> 

    [STAThread] 

    static void Main() 

    { 

      //Verifica se o programa já está em execução 

      Process[] ListaProcessos = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName); 

      foreach (Process P in ListaProcessos) 

        if (P.Id != Process.GetCurrentProcess().Id) 

        { 

          MessageBox.Show("Este programa já está sendo executado.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information); 

          return; 

        } 

      //Código gerado automaticamente 

      Application.EnableVisualStyles(); 

      Application.SetCompatibleTextRenderingDefault(false); 

      Application.Run(new Form1()); 

    } 

  } 

}