Question

Je développe une application qui contrôle une machine.
Lorsque je reçois une erreur de la machine, les utilisateurs devraient pouvoir la remarquer directement. Une façon de procéder consiste à faire clignoter la barre d'état dans la barre des tâches.Lorsque la machine efface l'erreur, le bac doit cesser de clignoter.

Il y a un petit désagrément en utilisant la fonction FlashWindowEx, quand j'efface le clignotement de la fenêtre, elle reste (dans mon cas winXP) orange (ne clignote pas).
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;
        }

Dans mon cas, j'utilise FLASHW_TRAY pour démarrer le clignotement et FLASHW_STOP pour arrêter le clignotement.

Est-ce que je fais quelque chose de mal ou s'agit-il d'un bug connu de WinXP et existe-t-il un correctif ?

Était-ce utile?

La solution

Le comportement est le même lorsqu'une fenêtre finit de clignoter aussi longtemps qu'elle est censée le faire :le bouton de la barre des tâches reste coloré.Je ne pense pas que ce soit un bug.Si vous y réfléchissez, lorsque vous utilisez FLASHW_STOP, le clignotement s'arrête en fait, mais le but du clignotement est d'attirer l'attention de l'utilisateur.Le bouton reste coloré car l'utilisateur n'a peut-être toujours pas baissé les yeux et découvert lequel la fenêtre essayait d'attirer son attention.Garder le bouton coloré permet de conserver ces informations disponibles.

Autres conseils

Voici une erreur :

fInfo.uCount = UInt32.MaxValue ;

Vous devez définir fInfo.uCount sur zéro lors de l'appel avec le paramètre FLASHW_STOP.Sinon, lorsque vous essayez d'appeler stop lorsque le bouton de la barre des tâches est actif, il restera actif.

Vous pouvez consulter une note sur un comportement non défini ici :http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx

Je sais que c'est un vieux message mais cela peut aider d'autres personnes à résoudre ce problème rapidement.

Désolé pour la réponse tardive, j'étais absent du bureau.

Si c'est la fonctionnalité attendue, je pense que ce n'est pas si utile, il devrait au moins y avoir une réinitialisation.

Je l'ai corrigé maintenant simplement en utilisant le FLASHW_ALL | FLASHW_TIMERNOFG combinaison.

Au fait, je ne peux pas évaluer vos réponses, pas encore assez de représentants.

Réglez simplement uCount sur 0 pour arrêter le clignotement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top