2008-08-06 37 views
34

Estoy escribiendo una aplicación que necesita traer la ventana de una aplicación externa al primer plano, y no necesariamente robar el foco (hay una configuración que el usuario puede alternar para robar/no robar atención).Llevando la ventana al frente en C# usando Win32 API

¿Cuál es la mejor manera de hacerlo con la API win32? He intentado SetForeground() pero siempre roba el foco y no funciona sistemáticamente.

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

Respuesta

14

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

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

Intente capturar el enfoque con SetCapture antes de realizar la llamada. También busque diferentes formas de llevar la ventana al frente: SetForeGroundWindow, SetActiveWindow, incluso simulando un clic del mouse puede hacer esto.

2

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

5

¿Cuál es la diferencia entre SetForeGroundWindow, SetActiveWindow y BringWindowToTop? Parece como si todos hicieran lo mismo.

Según MSDN, SetForeGroundWindow activará la ventana y dirigirá el foco del teclado hacia ella. Esto intenta funcionar incluso cuando su proceso está en segundo plano. SetActiveWindow hace lo mismo que SetForeGroundWindow, pero no hace nada si su aplicación no es la más avanzada. Finalmente, BringWindowToTop solo lleva la ventana a la parte superior y no cambia el foco del teclado.

2

¿Has probado usar SetWindowPos. Esta es la función canónica para mover, redimensionar y configurar z-order en Windows. Hay un indicador SWP_NOACTIVATE que puede usar. Mira http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx. No he probado esto en una ventana perteneciente a otro proceso, pero probablemente valga la pena intentarlo.

1

SetWindowPos + SWP_NOACTIVATE hace el trabajo.

0

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

Cuestiones relacionadas