La solución perfecta para el funcionamiento exclusivo de singletons de aplicaciones basadas en C# - Artículos de la serie de investigación de código abierto

  Esta vez, presentaré el código del único esquema en ejecución de un singleton de aplicación.

  Sabemos que algunas aplicaciones necesitan ejecutarse en una sola instancia en el sistema operativo, porque si el programa se abre demasiado, afectará el efecto de ejecución del programa. El ejemplo más básico es una impresora, que solo puede ejecutar una instancia. . Aquí comparto el código que el autor ejecuta en una sola instancia, los lectores que lo necesiten pueden reutilizar el código en sus propios proyectos.

  1.  Directorio de proyectos;

  El siguiente es el directorio del proyecto, porque es una pieza de código, por lo que el ejemplo dado es relativamente simple.

        

  2.  Introducción del código;

  El código aquí es bastante simple. Es obtener el GUID de la aplicación y el proceso en ejecución para juzgar. Debido a que el GUID es único, cambiar el nombre del programa o cambiar el directorio no lo afectará; el juicio del proceso en ejecución es un método adicional para evitar que el actual El programa del directorio se ejecute varias veces.

 1 namespace ProgramInstance
 2 {
 3     using System;
 4     using System.Diagnostics;
 5     using System.Reflection;
 6     using System.Runtime.InteropServices;
 7     using System.Threading;
 8 
 9 
10     /// <summary>
11     /// 单例程序操作类
12     /// </summary>
13     internal class SingleInstance
14     {
15         /// <summary>
16         /// 程序是否运行
17         /// </summary>
18         /// <returns>true 程序已运行;false 程序未运行</returns>
19         internal static bool IsRunning(out Process process)
20         {
21             //如果判断全系统唯一,直接用下列方法;如果判断当前文件夹唯一,则将GUID判断去掉;
22             new Mutex(true, 
          new Guid(((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(),
            typeof(GuidAttribute))).Value).ToString("N"),
          out bool createdNew); 23 process = RunningInstance(); 24 return (!createdNew || (process != null)); 25 } 26 /// <summary> 27 /// 获取当前程序进程实例 28 /// </summary> 29 /// <returns>程序进程实例</returns> 30 private static Process RunningInstance() 31 { 32 Process currentProcess = Process.GetCurrentProcess(); 33 foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) 34 { 35 if ((process.Id != currentProcess.Id) &&
              (Assembly.GetExecutingAssembly().Location.Replace("/", @"\") == currentProcess.MainModule.FileName)) 36 { 37 return process; 38 } 39 } 40 return null; 41 } 42 } 43 }
 1 namespace SingleInstance
 2 {
 3     using System;
 4     using System.Diagnostics;
 5     using System.Runtime.InteropServices;
 6     using System.Windows.Forms;
 7 
 8     /// <summary>
 9     /// 程序类
10     /// </summary>
11     internal static class Program
12     {
13         [DllImport("User32.dll")]
14         private static extern bool SetForegroundWindow(IntPtr hWnd);
15         [DllImport("User32.dll")]
16         private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
17 
18         /// <summary>
19         /// 应用程序的主入口点
20         /// </summary>
21         [STAThread]
22         static void Main()
23         {
24             if (ProgramInstance.SingleInstance.IsRunning(out Process process))
25             {
26                 ShowWindowAsync(process.MainWindowHandle, 9 | 1);
27                 SetForegroundWindow(process.MainWindowHandle);
28 
29                 return;
30             }
31 
32 
33             Application.EnableVisualStyles();
34             Application.SetCompatibleTextRenderingDefault(false);
35 
36             Application.Run(new Form1());
37         }
38     }
39 }

  3.  Ejecute la captura de pantalla;

  Debido a que el segmento de código se reutiliza, aquí no se proporciona la captura de pantalla en ejecución.

  4.  Descarga del código fuente;

  Si necesita el código de muestra, vaya al siguiente enlace para descargarlo:

  https://download.csdn.net/download/lzhdim/88158095

  Lo anterior presenta un ejemplo de ejecución de una sola instancia de un programa de aplicación escrito en C#, con la esperanza de ayudar a los lectores que tienen esta necesidad. Posteriormente, se compartirán los segmentos de código que el autor considere útiles, para que los lectores que los necesiten puedan reutilizar los segmentos de código.

  Nota: si necesita abrir más aplicaciones (colocarlas en otras carpetas o copiar y cambiar el nombre de la aplicación en la carpeta actual), elimine el juicio GUID.

Supongo que te gusta

Origin blog.csdn.net/lzhdim/article/details/132115106
Recomendado
Clasificación