2009-05-28 1 views
5

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

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

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

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

ответ

0

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

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

0

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

3

Это относится к комментарию к ответу Aarons, но мне еще не разрешено комментировать.

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

+0

Проблема с этим состоит в том, что, в то время как я могу захватить событие icon_click, и я знаю, что воздушный шар закрыл в тот момент, я Не уверен, когда показывать следующий воздушный шар. Отображение его немедленно будет зависеть от того, что делает пользователь. Я могу сделать это с задержкой после щелчка, и это все еще связано с таймером, поэтому я бы скорее использовал таймер во всех случаях. – SqlRyan

+0

Хорошая точка. Предполагая, что единственное, что пользователь может «сделать там», - это активировать контекстное меню, если вы обрабатываете меню «Открытие» и «Закрытые события» и отображаете только следующий воздушный шар, если контекстное меню не активируется. Вы также можете принять это решение в зависимости от того, какой пункт меню выбирается пользователем – Bob

0

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

+0

. Я думаю, что это именно то, что происходит со мной, но Раймонд соглашается с тем, что нет никакого способа узнать, закрыт ли воздушный шар. Мне кажется, что событие BalloonTipClosed должно срабатывать, если воздушный шар закрыт каким-либо образом, но он не срабатывает, если вы закрываете воздушный шар, нажимая на NotifyIcon, как мне кажется. Возможно, я обновлю версию своего приложения и посмотрю, изменит ли это поведение. – SqlRyan