FlashWindowEx FLASHW_STOP 仍然使任务栏保持颜色

Posted

技术标签:

【中文标题】FlashWindowEx FLASHW_STOP 仍然使任务栏保持颜色【英文标题】:FlashWindowEx FLASHW_STOP still keeps taskbar colored 【发布时间】:2010-09-06 12:35:42 【问题描述】:

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

使用 FlashWindowEx 函数有一个小烦恼,当我清除窗口的闪烁时,它保持(在我的情况下为 winXP)橙色(不闪烁)。


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

在我的例子中,我使用 FLASHW_TRAY 开始闪烁并使用 FLASHW_STOP 停止闪烁。

是我做错了什么还是这是 WinXP 的一个已知错误,是否有解决办法?

【问题讨论】:

【参考方案1】:

当窗口完成闪烁的时间达到预期的时间时,行为是相同的:任务栏按钮保持着色。我不认为这是一个错误。仔细想想,当你使用 FLASHW_STOP 时,闪烁确实会停止,但闪烁的目的是为了引起用户的注意。该按钮保持彩色是因为用户可能还没有向下看并发现哪个窗口试图引起她的注意。使按钮保持颜色使该信息可用。

【讨论】:

【参考方案2】:

这是一个错误:

fInfo.uCount = UInt32.MaxValue;

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

您可以在此处查看有关未定义行为的注释: http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx

我知道这是一个旧帖子,但它可以帮助其他人快速解决这个问题。

【讨论】:

【参考方案3】:

抱歉回复晚了,我不在办公室。

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

我现在只使用FLASHW_ALL | FLASHW_TIMERNOFG 组合修复它。

顺便说一句,无法评价你的答案,还没有足够的代表。

【讨论】:

【参考方案4】:

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

【讨论】:

为你的答案添加一些解释!【参考方案5】:

固定为 uCount=0

if (flags = FLASHW_STOP) .uCount = 0 else .uCount = 800

错误行为是,如果您从 Window 本身内部的 click/kb 事件调用 flashw_stop,则任务栏按钮会在该时刻被着色时保持着色。

有了新的逻辑线,完成了。

【讨论】:

以上是关于FlashWindowEx FLASHW_STOP 仍然使任务栏保持颜色的主要内容,如果未能解决你的问题,请参考以下文章

停止任务栏闪烁

闪烁窗口不适用于 TabbedThumbnail(自定义任务栏预览)