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.