Delphi - Как найти источник всплывающего всплывающего «всплывающего окна» в трее? - PullRequest
1 голос
/ 08 марта 2011

У меня есть приложение D2006, которое уведомляет о различных событиях с помощью подсказки в трее. Время от времени, но не очень часто - скажем, 1 из 10 вызовов приложения - один из советов решает, что оно будет появляться снова и снова ... навсегда. Единственное, что его останавливает, - это закрыть приложение.

Если приложение выдает другое всплывающее окно int, оно заменяет подсказку-фантом, но затем после истечения срока действия новой подсказки подсказка-фантом возвращается. Аналогично, если я закрою фантомную подсказку, она немедленно вернется.

Я убедился, что код для создания подсказки не вызывается повторно. Намек возникает где-то глубже в недрах.

    MainForm.TrayIcon1.BalloonFlags   := Flag ;
    MainForm.TrayIcon1.BalloonTitle   := Title ;
    MainForm.TrayIcon1.BalloonHint    := Message ;
    MainForm.TrayIcon1.BalloonTimeout := Delayms ;
    MainForm.TrayIcon1.ShowBalloonHint ;

Ответы [ 2 ]

5 голосов
/ 08 марта 2011

Создайте общую точку входа для подсказки. то есть функция-обертка. Наряду с отображаемым текстом включите еще один строковый параметр с именем WhereCalledFrom и используйте его, чтобы определить, какая часть вашего приложения вызывает подсказку.
Внутри оболочки запишите все вызовы подсказок (в файл .txt, отладчик GExperts, строку отладки вывода Windows, журнал событий Windows и т. Д.) Для записи даты / времени, WhereCalledFrom и сообщения. Это должно позволить вам довольно легко отследить это.

0 голосов
/ 10 марта 2011

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

Вдобавок к этому (у меня были похожие проблемы в c # - я думаю, что это больше связано с Windows, а не с IDE), и одним из решений было вручную сделать иконку в трее невидимой, а затем видимой, т.е.

TrayIcon1.Visible := false;
TrayIcon1.Visible := true;

Поэтому, когда вы вручную скрываете значок всплывающей подсказки, запустите приведенный выше код, чтобы «очистить» системный трей. Это может остановить подсказку «призрака». Просто попробовать.

...