Как узнать, закрылась ли всплывающая подсказка в системном трее?

У меня есть приложение, которое использует NotifyIcon в трее, чтобы скрыть/восстановить приложение, а также всплывающие уведомления пользователю о событиях приложения. В моем приложении есть очередь уведомлений, и я использую событие NotificationIcon.BalloonTipClosed, чтобы определить, когда нужно сбросить всплывающую подсказку и показать следующее уведомление (если оно есть в очереди).

Этот метод, по-видимому, отлично работает в обеих обычных случаях (пользователь позволяет всплывающему подсказке закрыться по истечении времени ожидания, и пользователь нажимает «X» в подсказке, чтобы принудительно закрыть его), но есть третий случай, когда BalloonTipClosed не вызывается:

  1. всплывает всплывающее окно с уведомлением
  2. Пока он виден, пользователь щелкает правой кнопкой мыши значок уведомления, чтобы вызвать контекстное меню, в результате чего всплывающее окно исчезает.

Событие BalloonTipClosed не запускается в этом случае - я полагаю, что это ошибка в структуре (я использую 2.0), но есть ли у кого-нибудь идеи по этому поводу? Если я не получаю это событие, мое приложение всегда считает, что всплывающая подсказка видна (у меня есть логическое значение, которое предотвращает одновременное отображение нескольких всплывающих подсказок), и оно никогда больше не будет отображать другой значок, пока оно работает.


person SqlRyan    schedule 28.05.2009    source источник


Ответы (4)


Это относится как комментарий к ответу Аарона, но мне пока не разрешено комментировать.

Если вы обрабатываете события BalloonTipClicked и MouseClick в NotifyIcon (а также BalloonTipClosed), вы можете зафиксировать все способы закрытия всплывающей подсказки. Единственное, о чем вы должны знать, это то, что несколько сценариев будут вызывать несколько событий, поэтому обязательно закодируйте это (что-то вроде isClosed = true, а затем сбросьте это при отображении нового всплывающего окна).

person Bob    schedule 05.06.2009
comment
Проблема в том, что, хотя я могу зафиксировать событие icon_click и знаю, что всплывающая подсказка в этот момент закрылась, я не знаю, когда отображать следующую всплывающую подсказку. Отображение его немедленно наложило бы на то, что пользователь делает там внизу. Я мог бы сделать это с задержкой после щелчка, и это все еще включает таймер, поэтому я бы предпочел просто использовать таймер во всех случаях. - person SqlRyan; 09.06.2009
comment
Хорошая точка зрения. Предполагая, что единственное, что пользователь может «сделать внизу», — это активировать контекстное меню, если вы обрабатываете события меню «Открытие» и «Закрытие» и отображаете следующее всплывающее окно только в том случае, если контекстное меню не активировано. Вы также можете принять это решение на основе того, какой пункт меню выбирает пользователь. - person Bob; 09.06.2009

В обработчике события BalloonTipClicked я проверял, была ли нажата правая кнопка мыши и установлено ли логическое значение false.

person Aaron M    schedule 29.05.2009

Вот что я в итоге сделал, хотя мне не особенно нравится это решение. Я добавил в форму второй таймер и установил его на 10 секунд. Когда всплывает уведомление (когда я открываю его), я запускаю таймер, а затем в BalloonTipClosed останавливаю его. Если таймер тикает (это означает, что BalloonTipClosed еще не запущен), я вручную показываю следующую подсказку.

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

person SqlRyan    schedule 04.06.2009

Я думаю, что этот пост Рэймонда Чена об уведомлениях во всплывающих подсказках может вам помочь: http://blogs.msdn.com/oldnewthing/archive/2009/05/04/9585032.aspx

person gnobal    schedule 05.06.2009
comment
Я думаю, что это именно то, что происходит со мной, но Рэймонд соглашается, что на самом деле нет способа определить, закрыт ли шар. Мне кажется, что событие BalloonTipClosed должно срабатывать, если шар вообще каким-либо образом закрыт, но он не срабатывает, если вы закрываете шар, щелкнув NotifyIcon, как я думаю, так и должно быть. Возможно, я обновлю версию фреймворка своего приложения и посмотрю, изменит ли это поведение. - person SqlRyan; 06.06.2009