FlashWindowEx FLASHW_STOP ainda mantém a barra de tarefas colorida
Pergunta
Estou desenvolvendo uma aplicação que controla uma Máquina.
Quando recebo um erro da Máquina, os usuários devem ser capazes de notá-lo diretamente, uma forma de fazer isso é piscar a bandeja na barra de tarefas.Quando a máquina eliminar o erro, a bandeja deverá parar de piscar.
Há um pequeno incômodo em usar a função FlashWindowEx, quando eu limpo o piscar da janela, ela fica (no meu caso winXP) laranja (sem piscar).
[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;
}
No meu caso eu uso FLASHW_TRAY para começar a piscar e FLASHW_STOP para parar de piscar.
Estou fazendo algo errado ou isso é um bug conhecido do WinXP e há uma solução para isso?
Solução
O comportamento é o mesmo quando uma janela termina de piscar pelo tempo que deveria:o botão da barra de tarefas permanece colorido.Eu não acho que isso seja um bug.Se você pensar bem, quando você usa FLASHW_STOP, o piscar de fato para, mas o objetivo do piscar é chamar a atenção do usuário.O botão permanece colorido porque o usuário ainda pode não ter olhado para baixo e descoberto qual janela estava tentando chamar sua atenção.Manter o botão colorido mantém essas informações disponíveis.
Outras dicas
Aqui está um erro:
fInfo.uCount = UInt32.MaxValue;
Você deve definir fInfo.uCount como zero ao chamar com o parâmetro FLASHW_STOP.Caso contrário, quando você tentar ligar para parar quando o botão da barra de tarefas estiver ativo, ele permanecerá ativo.
Você pode verificar uma observação sobre comportamento indefinido aqui:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx
Eu sei que é um post antigo, mas pode ajudar outras pessoas a resolver esse problema rapidamente.
Desculpe pela demora na resposta, estava fora do escritório.
Se essa é a funcionalidade esperada acho que não é tão útil, pelo menos deveria haver um reset.
Eu consertei agora apenas usando o FLASHW_ALL | FLASHW_TIMERNOFG
combinação.
A propósito, não é possível avaliar suas respostas, ainda não há representante suficiente.
Basta definir uCount como 0 para parar de piscar.