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?
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.
¿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.
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.
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.
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.
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.
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