Traer Ventana al frente en C# usando la API Win32


Estoy escribiendo una aplicación que necesita llevar la ventana de una aplicación externa al primer plano, y no necesariamente robar el enfoque (hay una configuración que el usuario puede alternar para robar/no robar el enfoque).

¿Cuál es la mejor manera de hacerlo usando la API de win32? He probado setForeground () pero siempre roba el enfoque y no funciona consistentemente.

¿Cuál es la mejor manera de hacerlo? ¿Alguna idea?

 36
Author: adeel825, 2008-08-06

6 answers

SetForegroundWindow se supone que roba el foco y hay ciertos casos en los que fallará.

La función SetForegroundWindow pone el hilo que creó la ventana especificada en primer plano y activa la ventana. La entrada del teclado se dirige a la ventana

Intenta capturar el foco con SetCapture antes de hacer la llamada. También busque en diferentes formas de llevar la ventana al frente: SetForegroundWindow, SetActiveWindow, even simular un clic del ratón puede hacer esto.

 14
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-06 01:06:45

¿Cuál es la diferencia entre SetForegroundWindow, SetActiveWindow y BringWindowToTop? Parece que todos hacen lo mismo.

De acuerdo con MSDN, SetForegroundWindow activará la ventana y dirigirá el enfoque del teclado a ella. Esto intenta funcionar incluso cuando el proceso está en segundo plano. SetActiveWindow hace lo mismo que SetForegroundWindow, pero no hace nada si su aplicación no es la aplicación más frontal. Por último, BringWindowToTop solo lleva la ventana a la parte superior, y no cambia el enfoque del teclado.

 5
Author: NilObject,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-06 13:20:08

Puede probar la función BringWindowToTop para no robar el foco. No lo he usado, pero parece ser lo que estás buscando.

 2
Author: NilObject,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-06 01:37:37

¿Ha intentado usar SetWindowPos? Esta es la función canónica para mover, cambiar el tamaño y establecer el orden z en Windows. Hay una bandera SWP_NOACTIVATE que puede usar. Mira http://msdn.microsoft.com/en-us/library/ms633545 (VS.85).aspx. No he probado esto en una ventana que pertenece a otro proceso, pero probablemente vale la pena intentarlo.

 2
Author: Mike Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-24 21:51:34

SetWindowPos + SWP_NOACTIVATE hace el trabajo.

 1
Author: Kenny Zhou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-18 07:23:12

Puede usar FindWindow para obtener el HWND de la ventana, luego use la función BringWindowToTop que se encuentra en la API Win32.

 0
Author: ManAmongHippos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-06 14:44:47