FlashWindowEx FLASHW_STOP по-прежнему сохраняет цвет панели задач

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

Есть одно небольшое неудобство при использовании функции FlashWindowEx, когда я убираю мигание окна, оно остается (в моем случае winXP) оранжевым (не мигает) .
FlashWindowEx FLASHW_STOP по-прежнему сохраняет цвет панели задач


    [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 и есть ли ее исправление?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
3 189
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

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

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

Вот ошибка:

fInfo.uCount = UInt32.MaxValue;

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

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

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

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

Добавьте пояснение к своему ответу.!

Sandeep 20.04.2016 13:14

Другие вопросы по теме