FlashWindowEx FLASHW_STOP mantiene comunque colorata la barra delle applicazioni
Domanda
Sto sviluppando un'applicazione che controlla una macchina.
Quando ricevo un errore dalla macchina, gli utenti dovrebbero essere in grado di notarlo direttamente, un modo per farlo è lampeggiare il vassoio sulla barra delle applicazioni.Quando la macchina cancella l'errore, il vassoio dovrebbe smettere di lampeggiare.
C'è un piccolo fastidio nell'usare la funzione FlashWindowEx: quando cancello il lampeggio della finestra, questa rimane (nel mio caso WinXP) arancione (non lampeggiante).
[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;
}
Nel mio caso utilizzo FLASHW_TRAY per iniziare a lampeggiare e FLASHW_STOP per interromperlo.
Sto facendo qualcosa di sbagliato o si tratta di un bug noto di WinXP ed esiste una soluzione?
Soluzione
Il comportamento è lo stesso quando una finestra smette di lampeggiare per il tempo previsto:il pulsante della barra delle applicazioni rimane colorato.Non penso che questo sia un bug.Se ci pensi, quando usi FLASHW_STOP, il lampeggio in effetti si ferma, ma lo scopo del lampeggio è attirare l'attenzione dell'utente.Il pulsante rimane colorato perché l'utente potrebbe non aver ancora guardato in basso e scoperto Quale la finestra stava cercando di attirare la sua attenzione.Mantenere il pulsante colorato mantiene tali informazioni disponibili.
Altri suggerimenti
Ecco un errore:
fInfo.uCount = UInt32.MaxValue;
È necessario impostare fInfo.uCount su zero quando si chiama con il parametro FLASHW_STOP.Altrimenti, quando provi a chiamare Stop quando il pulsante della barra delle applicazioni è attivo, rimarrà attivo.
Puoi controllare una nota sul comportamento indefinito qui:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx
So che è un vecchio post ma può aiutare altre persone a risolvere rapidamente questo problema.
Scusate il ritardo nella risposta, ero fuori ufficio.
Se questa è la funzionalità prevista, penso che non sia così utile, almeno dovrebbe esserci un reset.
L'ho risolto ora semplicemente usando il file FLASHW_ALL | FLASHW_TIMERNOFG
combinazione.
A proposito, non posso valutare le tue risposte, non ho ancora abbastanza reputazione.
Basta impostare uCount su 0 per interrompere il lampeggiamento.