Pregunta

Estoy escribiendo una aplicación que necesita poner en primer plano la ventana de una aplicación externa 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 utilizando la API win32?Probé SetForeground() pero siempre roba el foco y no funciona de manera consistente.

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

¿Fue útil?

Solución

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

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

Intente capturar el enfoque con Establecer captura antes de realizar la llamada.Busque también diferentes formas de llevar la ventana al frente:SetForeGroundWindow, SetActiveWindow, incluso simulando un clic del mouse pueden hacer esto.

Otros consejos

¿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 aplicación principal.Finalmente, BringWindowToTop solo lleva la ventana a la parte superior y no cambia el foco del teclado.

Puedes probar la función BringWindowToTop para no robar el foco.No lo he usado, pero parece ser lo que buscas.

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

SetWindowPos + SWP_NOACTIVATE hace el trabajo.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top