Pregunta

Tengo esta aplicación Formularios de Windows en el que se encuentra en el área de notificación. Al hacer clic en el icono de la trae al frente, haciendo clic en él de nuevo (o hacer clic en el icono de la aplicación X) lo envía de vuelta. Este es el tipo de aplicación que tener la ventana siempre en la parte superior es importante cuando se visualiza haciendo clic en el icono (aunque es opcional).

Haga clic en el icono, aparece un menú contextual que se puede seleccionar para activar la opción "siempre encima" o no. Cuando se inicia la aplicación por primera vez, los ajustes de la aplicación se leen desde un archivo XML y estoy 99% de que esto está funcionando como debiera, la propiedad TopMost se lee correctamente (y escrito).

Después de algún tiempo (minutos, horas, días, lo que sea, que normalmente hibernan y rara vez apagado) el TopMost deja de funcionar . No cambio la opción, no creo que nada está cambiando el valor de la opción, pero hacer clic en el icono del área de notificación y aplicación no se lleva la delantera. Se muestra, pero es en el fondo (se muestra en el Alt + Tab), no es "siempre encima" como debería. Me abrir el menú contextual, desactivar la opción (causa está activado) y activar de nuevo y comienza a trabajar después de eso. La aplicación es ahora "siempre encima". Sin embargo, se puede perder esta habilidad en cualquier momento después de un tiempo.

No se puede entender por qué esto sucede y cómo sucede esto. ¿Alguien tiene alguna idea de por qué? Si no, alguna idea de cómo podría tratar de depurar este tipo de comportamiento?

EDIT:
He añadido una pieza de código para mostrar un cuadro de mensaje cuando la propiedad TopMost fue cambiado a ver si podía cuenta de cualquier comportamiento extraño, pero no era bueno. No ayudó porque era la forma con TopMost = true pero todavía estaba en el fondo ...

¿Fue útil?

Solución

Hay más de una ventana de "El órgano más importante". El órgano más importante sólo dice "Antes de todas las ventanas que no son más altas".

Estoy bastante seguro de una reinicialización del escritorio (por ejemplo, cuando hibernación) requiere otro SetWindowPos(hwnd, HWND_TOPMOST, ...) (que es la llamada a la API de Win32 subyacente).

Como solución alternativa, se puede restablecer y establezca la propiedad de nuevo cuando se muestra la ventana.

Otra posibilidad es que ocultando la ventana también cambia el orden Z -. Ya sea implícitamente cómo implementos de Win32 que, explícitamente o en la forma WinForms llaman a la ventana de ocultar / mostrar

Otros consejos

Al igual que Peterchen i Asimismo, no tienen ni idea de cómo llegar a la causa raíz. Pero por qué no hacer un poco más sencillo?

Al hacer clic en el icono que va a aparecer la ventana y confiar que TopMost todavía está activo. ¿Por qué no llamar SetWindowPos() con la derecha ajuste actual antes de mostrar la ventana. Esto no debe hacer ningún problema de rendimiento (sólo ocurre si el usuario hace clic en el icono) ni ningún otro efecto secundario.

Lo sé, sería muy bueno para averiguar la causa raíz, pero tal vez no vale la pena si se puede resolver con un poco de solución tales.

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