2010-05-06 10 views
5

Tengo esta aplicación de Windows Forms donde se encuentra en el área de notificación. Al hacer clic en el ícono se lo muestra en primer plano, al hacer clic de nuevo (o al hacer clic en el icono de la aplicación X) lo envía de vuelta. Este es el tipo de aplicación que tiene la ventana siempre en la parte superior es importante cuando se muestra haciendo clic en el icono (aunque es opcional).Error muy molesto con la propiedad TopMost en Windows Forms

Al hacer clic con el botón derecho en el icono, aparece un menú contextual donde se puede seleccionar habilitar la opción "siempre en la parte superior" o no. Cuando la aplicación se inicia por primera vez, la configuración de la aplicación se lee desde un archivo XML y estoy 99% de que esto está funcionando como debería, la propiedad TopMost está correctamente leída (y escrita).

Después de un tiempo (minutos, horas, días, lo que sea, normalmente hiberno y rara vez se apaga) el TopMostdeja de funcionar. No cambio la opción, no creo que nada cambie el valor de la opción, pero hago clic en el ícono del área de notificación y la aplicación no aparece en primer plano. Se muestra pero está en el fondo (se muestra en Alt + Tab), no está "siempre en la parte superior" como debería. Levanto el menú contextual, deshabilito la opción (porque está habilitada) y la habilito de nuevo, y luego comienza a funcionar. La aplicación ahora está "siempre en la cima". Sin embargo, puede perder esta habilidad en cualquier momento después de un tiempo.

No puedo entender por qué sucede esto y cómo sucede esto. ¿Alguien tiene alguna idea de por qué? Si no, ¿alguna idea de cómo podría intentar depurar tal comportamiento?

EDIT:
he añadido un trozo 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 el formulario estaba con TopMost = true pero todavía estaba en el fondo ...

Respuesta

5

Hay más de una ventana "Superior". Topmost solo dice "Antes de todas las ventanas no superiores".

Estoy bastante seguro de que una reinicialización del escritorio (como cuando hiberna) requiere otra SetWindowPos(hwnd, HWND_TOPMOST, ...) (que es la llamada subyacente de la API Win32).

Como solución temporal, puede restablecer y establecer la propiedad nuevamente al mostrar la ventana.

Otra posibilidad es que ocultar la ventana también cambie el orden Z, ya sea implícitamente cómo lo implementa Win32 o explícitamente en la forma en que WinForms llama a la ventana ocultar/mostrar.

+0

Sé que mi aplicación no es la única ventana superior, pero cosas como Windows Explorer, Firefox y otras cosas NO son de primer nivel y mi ventana debería estar encima de ellas. Lo cual no está sucediendo debido a este problema. Desactivo y vuelvo a habilitar la opción y se pone encima de ellos como debería. –

+0

Y no creo que hibernar sea el problema. Acabo de hacer una prueba rápida e hiberne la máquina con Explorer y Firefox abiertos. Después de restaurarlo, mi aplicación sigue siendo superior.Debe suceder en una situación diferente ... –

+0

¿Has probado la solución alternativa que sugerí? (después de mostrar la ventana, restablecer y configurar la propiedad "más alta") – peterchen

1

Como peterchen, tampoco tengo ni idea de cómo obtener la causa raíz. ¿Pero por qué no hacerlo un poco más simple?

Al hacer clic en su icono, aparecerá su ventana y confiará que TopMost todavía está activo. Por qué no llamar al SetWindowPos() con la configuración actual justo antes de mostrar la ventana. Esto no debería generar ningún problema de rendimiento (solo ocurre si el usuario hace clic en el icono) ni ningún otro efecto secundario.

Lo sé, sería genial averiguar la causa raíz, pero tal vez no valga la pena si puede resolverlo con una solución tan pequeña.

Cuestiones relacionadas