Заставить NotifyIcon отображаться в системном трее

У меня есть значок NotifyIcon, который отображается на панели задач, и я хочу показать всплывающую подсказку при первом запуске приложения (как предлагается здесь: Выполнить код C # после application.run ()), но событие Idle происходит до того, как значок появляется на панели задач, в результате чего всплывающее сообщение не появляется. Как я могу заставить NotifyIcon появляться перед вызовом ShowBalloonTip?


person Drew    schedule 06.03.2011    source источник
comment
В качестве побочного примечания у меня были некоторые проблемы с NotifyIcons в C # - одна из несоответствий, с которой я столкнулся, была решена путем принуждения свойства Visible к false, а затем true, то есть для обновления панели задач   -  person Simon    schedule 07.03.2011
comment
Спасибо, к сожалению, установка невидимого, а затем видимого не помогла.   -  person Drew    schedule 07.03.2011
comment
Это какая-то странная просьба. Windows не будет показывать воздушный шар, если пользователь находится вдали от клавиатуры - и будет откладывать его отображение до тех пор, пока он не вернется (чтобы максимально увеличить время, которое ваш баллон проводит с пользователем). Если приложение простаивает, то почти по определению пользователя там нет, и именно в это время вы не хотите показывать всплывающее сообщение (что нормально, поскольку Explorer все равно его не покажет). Но я соглашусь с ChrisF, поставь флаг.   -  person Ian Boyd    schedule 07.03.2011


Ответы (2)


Это довольно фундаментальная гонка, это еще один процесс, который заботится о иконке. Проводник Виндоус. Вы не можете сказать, когда он обо всем позаботился. Вызов Thread.Sleep (500) после установки Visible = true должен значительно улучшить шансы.

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

person Hans Passant    schedule 07.03.2011
comment
К сожалению, мне приходится использовать Thread.Sleep (), чтобы позаботиться об условиях гонки. - person Drew; 07.03.2011

Почему бы не установить флаг в режиме ожидания, а затем проверить состояние флага после установки значка уведомления как видимого:

// Application has become idle
firstTimeIdle = true;

Потом:

// Show notify icon
notifyIcon.Visible = true;
if (firstTimeIdle && !shownBalloon)
{
    notifyIcon.ShowBalloonTip(timeout, title, text, icon);
    shownBalloon = true;
}
person ChrisF    schedule 06.03.2011
comment
Это не совсем моя проблема, я настроил его так, что он показывает только один раз, но если NotifyIcon не виден, воздушный шар не появится. Мне нужен способ заставить NotifyIcon появиться. - person Drew; 07.03.2011
comment
@ Дрю - Ага. Я предполагал, что возникла проблема с тем, чтобы события происходили в правильном порядке. Установка notifyIcon.Visible на true должна заставить его появиться. - person ChrisF; 07.03.2011