tengo un programa de Windows que tiene dos 2 ventanas en ella:Win32: Llevar una ventana de arriba
hwnd (main interface)
hwnd2 (toplevel window, no parent, created by hwnd)
Cuando hago doble clic en hwnd, necesito hwnd2 a aparecer y mostrar algunos datos, por lo que utilizar esta función para llevar hwnd2 hacia arriba:
BringWindowToTop(hwnd2);
hwnd2 es llevado hacia arriba, pero hay una cosa extraña. Cuando vuelvo a hacer clic en hwnd2, hwnd (interfaz principal) aparece de nuevo automáticamente. He intentado utilizar la siguiente función para resolver este problema, pero ninguna de ellas funciona.
SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//doesn't work
BringWindowToTop(hwnd2); //This is the function brings hwnd2 to top
SetForegroundWindow(hwnd2); //doesn't work
SetWindowPos(hwnd2, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//doesn't work
SetWindowPos(hwnd2, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
// hwnd2 "always" on top, not what I want
SetActiveWindow(hwnd2); // doesn't work too (for replying to Magnus Skog, thanks)
SwitchToThisWindow(hwnd2, TRUE);// got the same problem with BringWindowToTop function
SwitchToThisWindow(hwnd2, FALSE);
¿Cómo puedo resolver este problema? Gracias de antemano.
(para responder a AJ, hwnd2 no tiene padres, ya que tiene que ser una ventana de nivel superior para que pueda estar delante/detrás de otras ventanas)
(hwnd2 es un reproductor multimedia que se compone de varias ventanas, una de las ventanas es para video, otros dos controles de la barra de progreso para la barra de volumen y un barra de herramientas para el panel de control)
(Hay una que podría ayudar, no importa en qué ventana haga clic hwnd2, hwnd aparece automáticamente tan rápido como "el mouse está encima de hwnd en orden Z", incluida la barra de menú y el área no cliente, etc.)
(este reproductor multimedia está escrito en Direct Show. Yo uso IVideoWindow :: put_Owner para poner la ventana de video como el propietario del video, Direct Show crea internamente una ventana de sub-video como elemento secundario de la ventana de video. A excepción de esta ventana de sub-video que no puedo ver el código fuente, no veo nada sospechoso en hwnd2.)
Encontré la razón, que es por Direct Show. Uso multithread para ejecutarlo, y luego el problema está resuelto. ¿¿Pero por qué??
Este problema se puede resolver utilizando PostMessage (en lugar de SendMessage).
Cualquier motivo específico por el cual hwnd2 no tiene padres? hwnd se puede establecer como padre durante la creación. –
¿Qué haces en el código de manejo del botón del mouse de hwnd2? ¿Hay algo sospechoso allí? –
Entonces, ¿cómo lo resolvió usando PostMessage? –