FlashWindowEx FLASHW_STOP 仍保持任务栏颜色
题
我正在开发一个控制机器的应用程序。
当我从机器收到错误时,用户应该能够直接注意到它,一种方法是在任务栏上闪烁托盘。当机器清除错误时,托盘应停止闪烁。
使用 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 的一个已知错误,是否有修复方法?
解决方案
当窗口完成闪烁时,行为是相同的,只要它应该:任务栏按钮保持彩色。我不认为这是一个错误。如果你想一想,当你使用FLASHW_STOP时,闪烁实际上确实停止了,但闪烁的目的是引起用户的注意。按钮保持彩色,因为用户可能仍然没有低头发现 哪个 窗户试图引起她的注意。保持按钮颜色可以保持该信息可用。
其他提示
这是一个错误:
fInfo.uCount = UInt32.MaxValue;
使用 FLASHW_STOP 参数调用时,应将 fInfo.uCount 设置为零。否则,当您尝试在任务栏按钮处于活动状态时调用停止时,它将保持活动状态。
您可以在此处查看有关未定义行为的注释:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx
我知道这是一篇旧文章,但它可以帮助其他人快速解决这个问题。
抱歉回复晚了,我不在办公室。
如果这是预期的功能,我认为它不是那么有用,至少应该有一个重置。
我现在只是使用 FLASHW_ALL | FLASHW_TIMERNOFG
组合。
顺便说一句,无法评价您的答案,还没有足够的代表。
只需将 uCount 设置为 0 即可停止闪烁。