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).
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;
        }

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top