C # Winform resolver se permite que el programa se ejecute sólo una instancia de varias maneras para explicar

C # Winform resolver se permite que el programa se ejecute sólo una instancia de varias maneras para explicar

Para lograr programa mutuamente excluyentes, por lo general hay varias maneras, utilizando el siguiente lenguaje C # para lograr:
Método uno:
Utilice el hilo de las variables mutuamente exclusiva para determinar si la instancia en ejecución mediante la definición de una variable mutex.
Los documentos en los principales Program.cs función () se sustituye por el siguiente código:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace NetTools{
    static class Program{

        [DllImport("user32.dll")]
        private static extern bool FlashWindow(IntPtr hWnd, bool bInvert);

        [DllImport("user32.dll")]
        private static extern bool FlashWindowEx(int pfwi);

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(){
            bool runone;
            System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone);
            if (runone){
                run.ReleaseMutex();
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                FrmRemote frm = new FrmRemote();
                int hdc = frm.Handle.ToInt32(); // write to ...
                Application.Run(frm);
                IntPtr a = new IntPtr(hdc);
            } else {
                MessageBox.Show("已经运行了一个实例了。");
                //IntPtr hdc = new IntPtr(1312810); // read from...
                //bool flash = FlashWindow(hdc, true);
            }
        }
    }
}

Definiciones: Por la declaración System.Threading.Mutex run = nueva System.Threading.Mutex (true, "single_test", fuera runone);

Para crear una carrera variable de exclusión mutua, que "single_test" como el nombre de exclusión mutua,

Cuando vuelve este método, si el sistema de nombres local de mutex o crear designado mutex, entonces el runone booleano es verdadero;

Si especifica un mutex llamado sistema ya existe, falso.

mutex llamado es para todo el sistema.

 


Método dos: el uso de proceso del juicio del camino, antes de correr el programa, averiguar si existe un proceso del mismo nombre en el proceso, mientras que la posición de funcionamiento es el mismo proceso, el caso no se ejecuta el programa, si no se ejecuta la aplicación en C # Sistema .. diagnóstico de procesos de clase espacio de nombres para implementar el código principal es el siguiente: 
1 , en Program.cs añaden función de archivo es el siguiente:

  public static System.Diagnostics.Process RunningInstance () {

            actual System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess ();

            System.Diagnostics.Process [] procesos = System.Diagnostics.Process.GetProcesses ();

            foreach (System.Diagnostics.Process proceso en los procesos) // encuentra el proceso del mismo nombre {

                si (process.Id! = current.Id) // ignorar el proceso actual

                {// confirmar la misma posición proceso en ejecución es el mismo.

                    si (System.Reflection.Assembly.GetExecutingAssembly (). Location.Replace ( "/", @ "/") == current.MainModule.FileName)

                    {// vuelve la otra instancia del proceso.

                        Proceso de vuelta;

                    }

                }

            } // No se encontró ninguna otra instancia, el retorno nulo.

            nula regresar;

        }

 

2 , el principal () la función se sustituye por el siguiente código:

Principal static void ()

        {

            si (RunningInstance () == null)

            {

                Application.EnableVisualStyles ();

                Application.SetCompatibleTextRenderingDefault (false);

                Application.Run (nuevo Form1 ());

            }

            más

            {

                MessageBox.Show ( "ha estado funcionando de una instancia de.");

            }

        }

 

 

 

Método tres: método átomo global, antes de crear un programa, compruebe si hay un (añadido al crear) átomo A particular, la tabla de átomo global visto, la presencia de dejar de crear, lo que indica que el programa ha ejecutar una instancia; plazo no existe y añadir un átomo específico una tabla de átomo global, para recordar la liberación de un átomo específico de un bien cuando se sale del programa, o se cerrará a la liberación. C # lograr lo siguiente: 
1. La declarado WinAPI interfaz de la función

        [System.Runtime.InteropServices.DllImport ( "kernel32.dll")]

        public static extern UInt32 GlobalAddAtom (String lpString); // átomos add

        [System.Runtime.InteropServices.DllImport ( "kernel32.dll")]

        public static extern UInt32 GlobalFindAtom (String lpString); // Encuentra átomo

        [System.Runtime.InteropServices.DllImport ( "kernel32.dll")]

        public static extern UInt32 GlobalDeleteAtom (UInt32 Natom); // átomo de eliminación

 

 2. Modificar Principal () función es la siguiente:

Principal static void ()

        {

            si (GlobalFindAtom ( "jiaao_test") == 77856768) // no encontrar átomo "jiaao_test"

            {

                GlobalAddAtom ( "jiaao_test"); // átomo add "jiaao_test"

                Application.EnableVisualStyles ();

                Application.SetCompatibleTextRenderingDefault (false);

                Application.Run (nuevo Form1 ());

            }

            más

            {

                MessageBox.Show ( "ha estado funcionando de una instancia de.");

            }

        }

 

3. En FormClosed agregar un evento en el siguiente código: 
       GlobalDeleteAtom (GlobalFindAtom ( "jiaao_test")); // borrar atómica "jiaao_test"

 

 

Método cuatro: a través de un proceso para determinar si activar:

    Programa de clase estática

    {

       /// <summary>

       /// principal punto de entrada para la aplicación.

       /// </ summary>

       [STAThread]

       Principal static void ()

       {

 

            // Obtener el ID del proceso actual

            int PID = Process.GetCurrentProcess () Id.;

            bool isRun = false;

            foreach (Proceso p en Process.GetProcessesByName ( "CallMaster"))

            {

                // Obtener el proceso del programa actual, compara

                si (Common.GetPath (). ToLower () == p.MainModule.FileName.ToLower ())

                {

                    si (PID! = p.Id)

                    {

                        isRun = true;

                        descanso;

                    }

                }

            }

            si (isRun == true)

            {

                Application.Exit ();

                regreso;

            }

 

 

           Application.EnableVisualStyles ();

           Application.SetCompatibleTextRenderingDefault (false);

           Application.Run (nuevo frmMain ());

       }

 

    }

El uso de radiación para obtener la ruta completa a la aplicación actual:

          GetPath public static string ()

        {

            volver System.Reflection.Assembly.GetExecutingAssembly () Ubicación.;

        }

 

Método cinco: determinar si iniciado por un hilo mutuamente excluyentes:

   Programa de clase estática

    {

        mutex System.Threading.Mutex estática privada;

 

        /// <summary>

        /// principal punto de entrada para la aplicación.

        /// </ summary>

        [STAThread]

        Principal static void ()

        {

            Application.EnableVisualStyles ();

            Application.SetCompatibleTextRenderingDefault (false);

 

            mutex = new System.Threading.Mutex (true, "OnlyRun");

            si (mutex.WaitOne (0, false))

            {

                Application.Run (nuevo MainForm ());

            }

            más

            {

                MessageBox.Show ( "el programa ya está en marcha!", "Consejos", MessageBoxButtons.OK, MessageBoxIcon.Information);

                Application.Exit ();

            }

        }

}

 

Se adjunta: C # en la manera de juzgar si un programa se está ejecutando?

si (System.Diagnostics.Process.GetProcessesByName ( "en el nombre del proceso del programa") .ToList (). contador> 0)

{

  // existen

}

 más

 {

  // no existe

 }

 

 

 

Publicado 17 artículos originales · ganado elogios 224 · vistas 280 000 +

Supongo que te gusta

Origin blog.csdn.net/cxu123321/article/details/104694004
Recomendado
Clasificación