FlashWindowEx FLASHW_STOP по-прежнему сохраняет цвет панели задач - PullRequest
5 голосов
/ 22 августа 2008

Я занимаюсь разработкой приложения, управляющего машиной.
Когда я получаю сообщение об ошибке от компьютера, пользователи должны иметь возможность непосредственно заметить это, один из способов сделать это - мигание лотка на панели задач. Когда машина устранит ошибку, лоток перестанет мигать.

Есть одно маленькое раздражение при использовании функции 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 и есть ли исправление для этого?

Ответы [ 4 ]

4 голосов
/ 22 августа 2008

Поведение остается тем же, когда окно перестает мигать так долго, как это должно быть: кнопка на панели задач остается цветной. Я не думаю, что это ошибка. Если вы думаете об этом, когда вы используете FLASHW_STOP, перепрошивка фактически прекращается, но смысл перепрошивки - привлечь внимание пользователя. Кнопка остается цветной, потому что пользователь все еще не мог смотреть вниз и обнаружил , о котором окно пыталось привлечь ее внимание. Удержание кнопки в цвете сохраняет эту информацию доступной.

3 голосов
/ 05 марта 2014

Вот ошибка:

fInfo.uCount = UInt32.MaxValue;

Вы должны установить fInfo.uCount в ноль при вызове с параметром FLASHW_STOP. В противном случае, когда вы попытаетесь вызвать остановку, когда кнопка панели задач активна, она останется активной.

Вы можете проверить примечание о неопределенном поведении здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx

Я знаю, что это старый пост, но он может помочь другим людям быстро решить эту проблему.

0 голосов
/ 20 апреля 2016

Просто установите uCount на 0, чтобы прекратить мигать.

0 голосов
/ 01 сентября 2008

Извините за поздний ответ, я был вне офиса.

Если это ожидаемая функциональность, я думаю, что это не так полезно, по крайней мере, должен быть сброс.

Я исправил это сейчас, используя комбинацию FLASHW_ALL | FLASHW_TIMERNOFG.

Кстати, не могу оценить ваши ответы, пока недостаточно реп.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...