visual tutorial studio servicio net español crear c# .net windows

c# - tutorial - Cómo verificar si otra instancia de la aplicación se está ejecutando



windows forms c# tutorial (6)

¿Quieres un código serio? Aquí está.

var exists = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1;

Esto funciona para cualquier aplicación (cualquier nombre) y se hará true si hay otra instancia ejecutándose de la misma aplicación.

Editar: Para solucionar sus necesidades, puede utilizar cualquiera de estos:

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;

de su método principal para salir del método ... O

if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill();

que matará al proceso de carga actual al instante.

Debe agregar una referencia a System.Core.dll para el método de extensión .Count() . Alternativamente, puede usar la propiedad .Length .

Posibles duplicados:
¿Cuál es la forma correcta de crear una aplicación de instancia única?
Volver a una aplicación ya abierta cuando un usuario intenta abrir una nueva instancia

Alguien podría mostrar cómo es posible verificar si se está ejecutando otra instancia del programa (por ejemplo, test.exe) y, en ese caso, detener la aplicación para que no se cargue si existe una instancia existente.


Aquí hay algunas buenas aplicaciones de muestra. A continuación se muestra una forma posible.

public static Process RunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName (current.ProcessName); //Loop through the running processes in with the same name foreach (Process process in processes) { //Ignore the current process if (process.Id != current.Id) { //Make sure that the process is running from the exe file. if (Assembly.GetExecutingAssembly().Location. Replace("/", "//") == current.MainModule.FileName) { //Return the other process instance. return process; } } } //No other instance was found, return null. return null; } if (MainForm.RunningInstance() != null) { MessageBox.Show("Duplicate Instance"); //TODO: //Your application logic for duplicate //instances would go here. }

Muchas otras formas posibles. Vea los ejemplos de alternativas.

El primero.

Segundo.

codeproject.com/KB/cs/restricting_instances.aspx

EDITAR 1: Acabo de ver tu comentario de que tienes una aplicación de consola. Eso se discute en la segunda muestra.



La clase estática de proceso tiene un método GetProcessesByName () que puede utilizar para buscar a través de procesos en ejecución. Simplemente busque cualquier otro proceso con el mismo nombre de ejecutable.


No está seguro de lo que quiere decir con ''el programa'', pero si desea limitar su aplicación a una instancia, puede usar un Mutex para asegurarse de que su aplicación no se esté ejecutando.

[STAThread] static void Main() { Mutex mutex = new System.Threading.Mutex(false, "MyUniqueMutexName"); try { if (mutex.WaitOne(0, false)) { // Run the application Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } else { MessageBox.Show("An instance of the application is already running."); } } finally { if (mutex != null) { mutex.Close(); mutex = null; } } }


Puedes intentar esto

Process[] processes = Process.GetProcessesByName("processname"); foreach (Process p in processes) { IntPtr pFoundWindow = p.MainWindowHandle; // Do something with the handle... // }