Почему значок на панели задач очищает отображаемый ранее?

У нас есть приложение, которое использует различные значки на панели задач для общения с пользователями. Различные значки указывают на разные внутренние состояния приложения (в противном случае без окон). Мы реализовали наш материал в области уведомлений, используя код из этого кода Проект Guru (версия MFC; это ни в коем случае не новое приложение), и до недавнего времени он работал нормально. Однако недавно мы попытались добавить еще один значок и столкнулись с проблемой.

Вот как это предполагается работать:

  1. У нас есть один главный значок (назовите его «A»), который указывает, что приложение запущено.

  2. Если происходит определенное событие, мы отображаем значок «B», над которым пользователь может навести указатель мыши, чтобы получить всплывающую подсказку со статусом этого события.

  3. Если запускается процедура (недавно добавленная, внутренняя, многопоточная), мы отображаем значок «C», и снова пользователь может навести на него курсор, чтобы увидеть всплывающую подсказку, которая указывает на ход выполнения этого действия.

Что на самом деле происходит: если значок 'B' виден, когда мы (пытаемся) отобразить значок 'C', то значок 'B' либо полностью исчезает, чтобы никогда не возвращаться, либо он остается там и значок ' C 'никогда не отображается, но всплывающая подсказка для значка «B» изменяется на значок «C», который должен иметь.

Я немного упростил сценарий; на самом деле у нас есть несколько других значков, но они используются редко. Однако у нас никогда не было проблем с отображением нескольких значков, пока мы не добавили значок «C» за последние пару недель.

Любые идеи? Рад прояснить все, что я не объяснил хорошо.


person Wilson F    schedule 27.10.2011    source источник
comment
Покажите нам свои звонки в Shell_NotifyIcon.   -  person David Heffernan    schedule 27.10.2011
comment
Ладно. Но что в m_tnd? Похоже, вы повторно используете NOTIFYICONDATA структуры или, возможно, передаете одни и те же hWnd и UID для всех значков.   -  person David Heffernan    schedule 27.10.2011
comment
Для отображения: Shell_NotifyIcon (NIM_ADD, & m_tnd) Для скрытия: Shell_NotifyIcon (NIM_DELETE, & m_tnd); (m_tnd, структура NOTIFYICONDATA, является членом класса CSystemTray (написанного человеком, разместившим проект CodeGuru, на который я ссылался). Она заполняется при инициализации класса.   -  person Wilson F    schedule 27.10.2011
comment
Каждый значок имеет свой собственный класс CSystemTray и, следовательно, свой собственный NOTIFYICONDATA, посвященный ему.   -  person Wilson F    schedule 27.10.2011
comment
Одна вещь, которую я забыл упомянуть, заключается в том, что для этих двух значков мы часто отправляем несколько команд show, не скрывая их между ними. Однако методы 'ShowIcon' и 'HideIcon' CSystemTray отслеживают, видны ли значки, и отправляют вызовы Shell_NotifyIcon () только в том случае, если они оправданы.   -  person Wilson F    schedule 27.10.2011
comment
И у каждой иконки своя пара hWnd / uID? Это важно, потому что в противном случае оболочка считает, что есть только один значок.   -  person David Heffernan    schedule 27.10.2011
comment
Хм, мы не устанавливаем uID. Все они равны нулю. Это наверное проблема! Хотите поместить это в ответ? Я это проверю. Есть ли что-то особенное в uID или это просто наше внутреннее значение для значка?   -  person Wilson F    schedule 27.10.2011


Ответы (1)


Вам нужно использовать разные uID для каждого значка. В документации говорится:

Определяемый приложением идентификатор значка на панели задач. Оболочка использует либо (hWnd плюс uID), либо guidItem, чтобы определить, с каким значком работать при вызове Shell_NotifyIcon. Вы можете связать несколько значков с одним hWnd, назначив каждому свой uID. Если указан guidItem, uID игнорируется.

Другими словами, вам нужно выбрать значение для uID. Таким образом оболочка узнает, к какому значку вы обращаетесь каждый раз, когда вы вызываете Shell_NotifyIcon(). Очевидно, вы должны использовать разные значения для каждого значка. Итак, используйте 0 для значка A, 1 для значка B и т. Д.

person David Heffernan    schedule 27.10.2011
comment
Оказывается, мы использовали разные идентификаторы для всех иконок ... кроме этих двух. Никогда даже не заметил (и пропустил эту важную часть документации). Спасибо! - person Wilson F; 27.10.2011