Frage

Ich entwickle eine Anwendung, die eine Maschine steuert.
Wenn ich einen Fehler von der Maschine erhalte, sollten die Benutzer dies direkt bemerken können. Eine Möglichkeit, dies zu erreichen, besteht darin, die Taskleiste in der Taskleiste zu blinken.Wenn das Gerät den Fehler behebt, sollte das Fach aufhören zu blinken.

Es gibt ein kleines Ärgernis bei der Verwendung der FlashWindowEx-Funktion: Wenn ich das Blinken des Fensters deaktiviere, bleibt es (in meinem Fall WinXP) orange (blinkt nicht).
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;
        }

In meinem Fall verwende ich FLASHW_TRAY, um das Blinken zu starten, und FLASHW_STOP, um das Blinken zu stoppen.

Mache ich etwas falsch oder ist das ein bekannter Fehler von WinXP und gibt es eine Lösung dafür?

War es hilfreich?

Lösung

Das Verhalten ist dasselbe, wenn ein Fenster so lange nicht mehr blinkt, wie es soll:Die Taskleistenschaltfläche bleibt farbig.Ich glaube nicht, dass das ein Fehler ist.Wenn Sie darüber nachdenken: Wenn Sie FLASHW_STOP verwenden, stoppt das Blinken tatsächlich, aber der Sinn des Blinkens besteht darin, die Aufmerksamkeit des Benutzers zu erregen.Die Schaltfläche bleibt farbig, da der Benutzer möglicherweise immer noch nicht nach unten geschaut und es entdeckt hat welche Fenster versuchte, ihre Aufmerksamkeit zu erregen.Wenn Sie die Schaltfläche farbig belassen, bleiben diese Informationen verfügbar.

Andere Tipps

Hier ist ein Fehler:

fInfo.uCount = UInt32.MaxValue;

Beim Aufruf mit dem Parameter FLASHW_STOP sollten Sie fInfo.uCount auf Null setzen.Andernfalls bleibt die Taskleistenschaltfläche aktiv, wenn Sie versuchen, „Stopp“ aufzurufen.

Einen Hinweis zu undefiniertem Verhalten finden Sie hier:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx

Ich weiß, das ist ein alter Beitrag, aber er kann anderen Leuten helfen, dieses Problem schnell zu lösen.

Entschuldigung für die späte Antwort, ich war nicht im Büro.

Wenn das die erwartete Funktionalität ist, denke ich, dass sie nicht so nützlich ist, sollte es zumindest einen Reset geben.

Ich habe es jetzt einfach mit dem behoben FLASHW_ALL | FLASHW_TIMERNOFG Kombination.

Übrigens, ich kann Ihre Antworten nicht bewerten, noch nicht genug Wiederholungen.

Setzen Sie uCount einfach auf 0, um das Blinken zu stoppen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top