Dar el foco a una aplicacion externa

by Valeriano Tortola 17. marzo 2008 11:38

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.

Tags: ,

C# 3.0 | .NET 3.5

Comentarios

17/03/2008 12:42:28 #

trackback

Trackback from vtortola

Dar el foco a una aplicación externa

vtortola |

17/03/2008 12:47:25 #

trackback

Trackback from Pensando en asíncrono

Dar el foco a una aplicación externa

Pensando en asíncrono |

Comentarios no permitidos