2011-09-09 25 views
7

He desarrollado una aplicación de Windows C# & creo un exe de ella. lo que quiero es que cuando cada vez que trato de ejecutar la aplicación, si es allready en estado de ejecución de lo que activar dicha aplicación cosa nueva aplicación se abre¿Cómo puedo establecer el foco en la aplicación que ya está en estado de ejecución?

eso quiere decir que no quiero abrir misma aplicación más de una vez

+0

Compruebe los siguientes podría obtener lo que busca http://stackoverflow.com/questions/2197620/how-to -set-focus-and-launch-the-already-running-application-on-button-click-event –

Respuesta

0

Utilice la siguiente parte del código para la comprobación de instancias múltiples de un ejecutable, y si es verdadero el rendimiento en la carga del formulario. Para ejecutar esta funcionalidad en su aplicación para incluir using System.Diagnostics; espacio de nombres

private bool CheckMultipleInstanceofApp() 
     { 
      bool check = false; 
      Process[] prc = null; 
      string ModName, ProcName; 
      ModName = Process.GetCurrentProcess().MainModule.ModuleName; 
      ProcName = System.IO.Path.GetFileNameWithoutExtension(ModName); 
      prc = Process.GetProcessesByName(ProcName); 
      if (prc.Length > 1) 
      { 
       MessageBox.Show("There is an Instance of this Application running"); 
       check = true; 
       System.Environment.Exit(0); 
      } 
      return check; 
     } 
3

Puede invocar SetForegroundWindow() y SetFocus() desde user32.dll para hacerlo.

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

// SetFocus will just focus the keyboard on your application, but not bring your process to front. 
// You don't need it here, SetForegroundWindow does the same. 
// Just for documentation. 
[DllImport("user32.dll")] 
static extern IntPtr SetFocus(HandleRef hWnd); 

Como argumento se pasa el identificador de ventana del proceso que desea llevar en la parte delantera y el enfoque.

SetForegroundWindow(myProcess.MainWindowHandle); 

SetFocus(new HandleRef(null, myProcess.Handle)); // not needed 

Ver también the restrictions of the SetForegroundWindow Methode on msdna.

+0

cuando agrego el archivo user32.dll, ¿la aplicación ha finalizado – Ayush

+0

con alguna excepción? –

+0

cierra el estudio visual. – Ayush

9

Utilice el código siguiente para establecer el foco en la aplicación actual:

 [DllImport("user32.dll")] 
     internal static extern IntPtr SetForegroundWindow(IntPtr hWnd); 

     [DllImport("user32.dll")] 
     internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
     ... 
     Process currentProcess = Process.GetCurrentProcess(); 
     IntPtr hWnd = currentProcess.MainWindowHandle; 
     if (hWnd != IntPtr.Zero) 
     { 
      SetForegroundWindow(hWnd); 
      ShowWindow(hWnd, User32.SW_MAXIMIZE); 
     } 
+1

+1 para el orden o los comandos (primero SetForeground ... y luego ShowWindow) de lo contrario, simplemente no funciona! –

+3

En caso de que no tenga la enumeración User32, los valores se pueden encontrar en: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx – BradleyDotNET

+0

Enum para copiar/pegar se puede encontrar aquí: http://www.pinvoke.net/default.aspx/Enums/SHOWWINDOW_FLAGS.html. Además, ShowWindow no debería ser necesario. –

Cuestiones relacionadas