C# FlashWindowEx FLASHW_STOP仍保持任务栏颜色

C# FlashWindowEx FLASHW_STOP仍保持任务栏颜色,c#,winapi,pinvoke,C#,Winapi,Pinvoke,我正在开发一个控制机器的应用程序。 当我收到来自机器的错误时,用户应该能够直接注意到它,一种方法是在任务栏上闪烁托盘。当机器清除错误时,托盘应停止闪烁 使用FlashWindowEx函数有一个小麻烦,当我清除窗口闪烁时,它保持(在我的例子中是winXP)橙色(不闪烁)。 在我的情况下,我使用FLASHW_托盘开始闪烁,FLASHW_停止停止闪烁 我是做错了什么,还是这是WinXP的一个已知错误,是否有修复方法?当窗口按预期时间闪烁时,行为是一样的:任务栏按钮保持彩色。我不认为这是一个错误。如果

我正在开发一个控制机器的应用程序。
当我收到来自机器的错误时,用户应该能够直接注意到它,一种方法是在任务栏上闪烁托盘。当机器清除错误时,托盘应停止闪烁

使用FlashWindowEx函数有一个小麻烦,当我清除窗口闪烁时,它保持(在我的例子中是winXP)橙色(不闪烁)。

在我的情况下,我使用FLASHW_托盘开始闪烁,FLASHW_停止停止闪烁


我是做错了什么,还是这是WinXP的一个已知错误,是否有修复方法?

当窗口按预期时间闪烁时,行为是一样的:任务栏按钮保持彩色。我不认为这是一个错误。如果你想一想,当你使用FLASHW_-STOP时,闪烁实际上会停止,但闪烁的目的是引起用户的注意。按钮保持彩色,因为用户可能还没有向下看并发现哪个窗口试图引起她的注意。保持按钮的颜色可以使信息保持可用。

很抱歉,我当时不在办公室

如果这是预期的功能,我认为它不是那么有用,至少应该有一个复位

我现在只需使用
FLASHW|u ALL | FLASHW_TIMERNOFG
组合就可以修复它

顺便说一句,无法对您的答案进行评分,尚未进行足够的重复。

这里有一个错误:

fInfo.uCount=UInt32.MaxValue

使用FLASHW\u STOP参数调用时,应将fInfo.uCount设置为零。 否则,当您尝试在任务栏按钮处于活动状态时调用stop时,它将保持活动状态

您可以在此处查看有关未定义行为的注释:


我知道这是一篇老文章,但它可以帮助其他人快速解决此问题。

只需将uCount设置为0以停止闪烁。

修复了uCount=0的问题

如果(flags=FLASHW_STOP){.uCount=0}其他{.uCount=800}

错误行为是,如果您从窗口内部的click/kb事件中调用flashw_stop,则如果该时刻被着色,任务栏按钮将保持着色


使用新的逻辑行,完成。

为您的答案添加一些解释。!

    [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;
        }