Estoy trabajando en una aplicación que resulta ser la herramienta de arranque para un instalador en el que también estoy trabajando. La aplicación hace algunas llamadas MSI para obtener la información que necesito para armar el asistente que es la ventana principal de mi aplicación, lo que hace que se abra una ventana de progreso mientras se recopila la información y luego se va una vez que se ha hecho. Luego, el asistente se configura y se inicia. Mi problema es que el asistente (derivado de CPropertySheet) no quiere pasar al frente y ser la aplicación activa sin que yo agregue algunas llamadas para hacerlo.¿Cómo obligo a mi aplicación a pasar al frente y concentrarse?
he resuelto el problema de llevarlo a la parte delantera con el siguiente código en mi método OnInitDialog():
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // force window to top
SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // lose the topmost status that the previous line gave us
Mi problema es que todavía no he encontrado la manera de hacer que la ventana autoactivarse (es decir, hacerse a sí mismo el que tiene el foco). SetFocus() no funcionará en este contexto. Necesito algo que fuerce la ventana a la parte superior del orden Z y lo active, preferiblemente en el menor número de llamadas posible.
Supongo que la ventana de progreso abierta al principio por las llamadas MSI está causando que la ventana principal se estropee, pero no tengo manera de evitar que aparezca esa ventana. Además, no tendría sentido ocultarlo, ya que le permite al usuario saber qué está sucediendo antes de que llegue la ventana principal.
No lo he probado, pero supongo que no es más efectivo que BringWindowToTop(). (Vea mi comentario sobre la respuesta de Mitch Wheat.) – RobH