Pregunta

Estoy desarrollando una aplicación que controla una Máquina.
Cuando recibo un error de la máquina, los usuarios deberían poder notarlo directamente; una forma de hacerlo es parpadear la bandeja en la barra de tareas.Cuando la máquina solucione el error, la bandeja debería dejar de parpadear.

Hay una pequeña molestia al usar la función FlashWindowEx: cuando borro el parpadeo de la ventana, permanece (en mi caso winXP) en naranja (sin parpadear).
Sample of status


    [Flags]
        public enum FlashMode {
            /// 
            /// Stop flashing. The system restores the window to its original state.
            /// 
            FLASHW_STOP = 0,
            /// 
            /// Flash the window caption.
            /// 
            FLASHW_CAPTION = 1,
            /// 
            /// Flash the taskbar button.
            /// 
            FLASHW_TRAY = 2,
            /// 
            /// Flash both the window caption and taskbar button.
            /// This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.
            /// 
            FLASHW_ALL = 3,
            /// 
            /// Flash continuously, until the FLASHW_STOP flag is set.
            /// 
            FLASHW_TIMER = 4,
            /// 
            /// Flash continuously until the window comes to the foreground.
            /// 
            FLASHW_TIMERNOFG = 12
        }

        public static bool FlashWindowEx(IntPtr hWnd, FlashMode fm) {
            FLASHWINFO fInfo = new FLASHWINFO();

            fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
            fInfo.hwnd = hWnd;
            fInfo.dwFlags = (UInt32)fm;
            fInfo.uCount = UInt32.MaxValue;
            fInfo.dwTimeout = 0;

            return FlashWindowEx(ref fInfo);
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct FLASHWINFO {
            public UInt32 cbSize;
            public IntPtr hwnd;
            public UInt32 dwFlags;
            public UInt32 uCount;
            public UInt32 dwTimeout;
        }

En mi caso uso FLASHW_TRAY para iniciar el flasheo y FLASHW_STOP para detener el flasheo.

¿Estoy haciendo algo mal o es un error conocido de WinXP y hay alguna solución?

¿Fue útil?

Solución

El comportamiento es el mismo cuando una ventana deja de parpadear durante el tiempo que se supone que debe hacerlo:el botón de la barra de tareas permanece coloreado.No creo que esto sea un error.Si lo piensas bien, cuando usas FLASHW_STOP, el parpadeo se detiene, pero el objetivo del parpadeo es llamar la atención del usuario.El botón permanece coloreado porque es posible que el usuario aún no haya mirado hacia abajo y descubierto cual La ventana intentaba llamar su atención.Mantener el botón de color mantiene esa información disponible.

Otros consejos

Aquí hay un error:

fInfo.uCount = UInt32.MaxValue;

Debe establecer fInfo.uCount en cero cuando llame con el parámetro FLASHW_STOP.De lo contrario, cuando intente llamar a detener cuando el botón de la barra de tareas esté activo, permanecerá activo.

Puede consultar una nota sobre el comportamiento indefinido aquí:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx

Sé que es una publicación antigua, pero puede ayudar a otras personas a resolver este problema rápidamente.

Perdón por la respuesta tardía, estaba fuera de oficina.

Si esa es la funcionalidad esperada, creo que no es tan útil, al menos debería haber un reinicio.

Lo arreglé ahora simplemente usando el FLASHW_ALL | FLASHW_TIMERNOFG combinación.

Por cierto, no puedo calificar tus respuestas, todavía no tengo suficiente representante.

Simplemente configure uCount en 0 para detener el parpadeo.

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