FlashWindowEx FLASHW_STOP garde toujours la barre des tâches colorée
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).
[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 ?
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.