FlashWindowEx FLASHW_STOP mantiene comunque colorata la barra delle applicazioni

StackOverflow https://stackoverflow.com/questions/21987

  •  09-06-2019
  •  | 
  •  

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).
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;
        }

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top