Aquí podría ser tu PUBLICIDAD


Llevando la ventana al frente en C # usando Win32 API

votos
35

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?

Publicado el 06/08/2008 a las 01:55
fuente por usuario adeel825
En otros idiomas...        العربية       

6 respuestas

votos
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 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.

Respondida el 06/08/2008 a las 02:06
fuente por usuario user2189331


Aquí podría ser tu PUBLICIDAD


votos
5

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

Respondida el 06/08/2008 a las 02:20
fuente por usuario NilObject

votos
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. 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.

Respondida el 24/08/2008 a las 10:51
fuente por usuario Mike Thompson

votos
2

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

Respondida el 06/08/2008 a las 02:37
fuente por usuario NilObject

votos
1

SetWindowPos + SWP_NOACTIVATE hace el trabajo.

Respondida el 18/12/2009 a las 08:23
fuente por usuario Kenny Zhou

votos
0

Se podría utilizar FindWindow para obtener el HWND de la ventana, a continuación, utilizar la función BringWindowToTop encontrado en la API Win32.

Respondida el 06/05/2011 a las 03:44
fuente por usuario ManAmongHippos