Dar el foco a una aplicación externa

Para dar el foco a una aplicación externa a la nuestra, se usa el método SetForegroundWindow de user32.dll mediante PInvoke:

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

Simplemente hay que encontrar el proceso y pasar a este método el puntero Process.MainWindowHandle, que apunta a la ventana principal de la aplicación, por ejemplo asi:

        Process runningProc = Process.GetProcessesByName("notepad").First();
        SetForegroundWindow(runningProc.MainWindowHandle);

Ojo que no es el mismo que Process.Handle🙂

Existe un pequeño… inconveniente… cuando el proceso que queremos controlar acaba de iniciarse. Es posible que algunas veces no funcione, ya que el MainWindowHandle  podría no estar configurado ó la aplicación no ha terminado de arrancar… y no se ha enganchado todavia al bucle de mensajes de la GUI (por lo que enviarle el mensaje de foco seria inútil). Para solventar este problema, podemos hacer uso del método Process.WaitForInputIdle que espera a que la aplicación este en estado Idle y por tanto… esperando mensajes de la cola:

        Process newProc = Process.Start("notepad");
        newProc.WaitForInputIdle(1000);
        SetForegroundWindow(newProc.MainWindowHandle);

Espero que sea de utilidad.

Dar el foco a una aplicación externa | vtortola.NET

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *