Delphi - Как найти источник всплывающего всплывающего "всплывающего окна"?
У меня есть приложение D2006, которое уведомляет о различных событиях с помощью подсказки на панели задач. Время от времени, но не очень часто - скажем, 1 из 10 вызовов приложения - один из советов решает, что оно будет появляться снова и снова... навсегда. Единственное, что его останавливает, - это закрыть приложение.
Если приложение выдает другое всплывающее окно int, оно заменяет подсказку-фантом, но после истечения срока действия новой подсказки подсказка-фантом возвращается. Точно так же, если я закрою призрачный намек, он немедленно вернется.
Я убедился, что код для создания подсказки не вызывается повторно. Намек возникает где-то глубже в недрах.
MainForm.TrayIcon1.BalloonFlags := Flag ;
MainForm.TrayIcon1.BalloonTitle := Title ;
MainForm.TrayIcon1.BalloonHint := Message ;
MainForm.TrayIcon1.BalloonTimeout := Delayms ;
MainForm.TrayIcon1.ShowBalloonHint ;
2 ответа
Сделайте общую точку входа для подсказки. т.е. функция-обертка. Наряду с отображаемым текстом, включите еще один строковый параметр с именем WhereCalledFrom и используйте его, чтобы определить, какая часть вашего приложения вызывает подсказку.
Внутри оболочки запишите все вызовы подсказок (в файл.txt, отладчик GExperts, строку отладки вывода Windows, журнал событий Windows и т. Д.), Чтобы записать дату / время, WhereCalledFrom и сообщение. Это должно позволить вам отследить это довольно легко.
Вы можете попытаться отключить автоматическое закрытие баллона и позволить вашему приложению сделать это, например, установить таймер, когда вы показываете баллон, а затем, когда таймер истекает, закройте баллон.
Вдобавок к этому (у меня были похожие проблемы в C# - я думаю, что это больше связано с Windows, а не с IDE), и одним из решений было вручную заставить иконку в трее невидимым, а затем видимым, т.е.
TrayIcon1.Visible := false;
TrayIcon1.Visible := true;
Поэтому, когда вы вручную скрываете значок всплывающей подсказки, запустите приведенный выше код, чтобы очистить системный трей. Это может остановить подсказку "призрака". Просто кое-что попробовать.