c# winapi

Llevando la ventana al frente en C#usando Win32 API



winapi (6)

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

De acuerdo con 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.

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 el foco).

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

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


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


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


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


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 está dirigida 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.


SetWindowPos + SWP_NOACTIVATE hace el trabajo.