2010-04-14 17 views
31

Solo queremos que una instancia de nuestra aplicación se ejecute en cualquier momento. Por lo tanto, al iniciar, busca si la aplicación se está ejecutando y si lo está, llama al SetForegroundWindow en la ventana principal.Llevar otra ventana de procesos al primer plano cuando tiene ShowInTaskbar = false

todo esto es bueno y bien ... en su mayor parte ..

Cuando nuestra aplicación se pone en marcha se mostrará una pantalla de bienvenida y un formulario de inicio de sesión. Ambas formas tienen ShowInTaskBar = false.

Debido a esto, si intenta iniciar otra copia de la aplicación cuando se muestra el formulario de inicio de sesión, ese formulario de inicio de sesión no se pone al frente!

Especialmente porque el usuario no puede ver nada en la barra de tareas, todo lo que cree es que la aplicación es duff y no puede iniciarse. No hay indicación de que haya otra instancia ejecutándose.

¿Hay alguna forma de solucionar este problema?

+0

Pregunta: establecer la propiedad del propietario del formulario de inicio de sesión no resuelven esto o lo hace no tiene efecto? – Asher

Respuesta

41

Bueno, el código está aquí. Incluso si el ShowInTaskBar es false, debería poder llevarlo al frente.

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)] 
    public static extern IntPtr FindWindow(String lpClassName, String lpWindowName); 

    [DllImport("USER32.DLL")] 
    public static extern bool SetForegroundWindow(IntPtr hWnd); 

    public static void bringToFront(string title) { 
     // Get a handle to the Calculator application. 
     IntPtr handle = FindWindow(null, title); 

     // Verify that Calculator is a running process. 
     if (handle == IntPtr.Zero) { 
      return; 
     } 

     // Make Calculator the foreground application 
     SetForegroundWindow(handle); 
    } 

Nota: Debe FindWindow usando la clase de la forma y no por su nombre como los formatos de pantalla de bienvenida a veces no tienen títulos o incluso la caja de control. Usa Spy ++ para cavar más profundo.

Utilice FindWindow en splash. Creo que esto es lo que quieres hacer: llevar la pantalla de inicio al frente mientras cargas el formulario principal.

+0

Estaba haciendo una llamada a System.Diagnostics.Process.GetProcessesByName para obtener el proceso y luego llamar a SetForegroundWindow en el process.MainWindowHandle. Sin ShowInTaskbar, no había MainWindowHandle. FindWindow es una buena forma de evitar esto. ¡Gracias! –

+0

¡Tantas formas de hacerlo, pero esta fue la única que funcionó para mí! – Lee

0
FindWindow(null, title); 

Buscará la primera ventana que coincida con la consulta. Esto puede conducir a un comportamiento inesperado si otra ventana usa el mismo título.

Aunque las posibilidades de que esto ocurra pueden parecer raras o imposibles (aplicación de instancia única) esto puede ocurrir fácilmente. El explorador de Windows, por ejemplo, utiliza el nombre del directorio seleccionado como título de la ventana (aunque invisible). Ahora bien, si el título de la ventana es un término común o coincide con el nombre del directorio de la aplicación, esto puede ser un problema.

16

Creo que esta es la mejor solución, porque sus restauraciones de estado minimizado:

public static class WindowHelper 
{ 
    public static void BringProcessToFront(Process process) 
    { 
     IntPtr handle = process.MainWindowHandle; 
     if (IsIconic(handle)) 
     { 
      ShowWindow(handle, SW_RESTORE); 
     } 

     SetForegroundWindow(handle); 
    } 

    const int SW_RESTORE = 9; 

    [System.Runtime.InteropServices.DllImport("User32.dll")] 
    private static extern bool SetForegroundWindow(IntPtr handle); 
    [System.Runtime.InteropServices.DllImport("User32.dll")] 
    private static extern bool ShowWindow(IntPtr handle, int nCmdShow); 
    [System.Runtime.InteropServices.DllImport("User32.dll")] 
    private static extern bool IsIconic(IntPtr handle); 
} 

llamada simple:

WindowHelper.BringProcessToFront(process); 
+1

Subiendo de nivel esta respuesta ya que restaura desde un estado minimizado también. – oppassum

Cuestiones relacionadas