Delphi: звук TrayIcon
В Delphi имеется компонент TrayIcon для создания иконки в трее задач Windows. Также данный компонент позволяет создавать "Уведомления". Можно указать текст сообщения, время до сокрытия и другие параметры. Когда появляется такое "Уведомление" проигрывается соответствующий системный звук.
Мой вопрос состоит в том, можно ли изменить этот системный звук на свой пользовательский или хотя бы убрать его при наступлении "Уведомления"?
procedure ShowBallon(aText: string);
begin
Form1.TrayIcon1.Visible := True;
Form1.TrayIcon1.Animate := True;
Form1.TrayIcon1.BalloonHint := aText;
Form1.TrayIcon1.ShowBalloonHint;
end;
Ответы (1 шт):
Компонент TTrayIcon является оберткой WinApi-функции Shell_NotifyIcon (это можно выяснить, если заглянуть в реализацию метода ShowBalloonHint).
Идем в msdn, ищем описание: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shell_notifyiconw
Функция принимает на вход структуру NOTIFYICONDATA, в описании которой https://docs.microsoft.com/en-us/windows/win32/api/shellapi/ns-shellapi-notifyicondataa сказано, что если в поле dwInfoFlags установить флаг NIIF_NOSOUND, то звук воспроизводиться не будет.
Далее по исходникам видим, что поле структуры dwInfoFlags заполняется данными из свойства класса BalloonFlags.
Но в типе TBalloonFlags нет флага, соответствующего NIIF_NOSOUND
Можно попробовать перед вызовом сделать следующий фокус:
Form1.TrayIcon1.BalloonFlags = TBalloonFlags(Cardianl(Form1.TrayIcon1.BalloonFlags) OR NIIF_NOSOUND);
перед вызовом ShowBalloonHint.
Возможно потребуется отключить какие-нибудь проверки компилятора.
Если не сработает, придется писать свой класс-наследник от TTrayIcon и перегружать метод ShowBalloonHint, благо он виртуальный.
PS
Изменить звук не получится, т.к. он устанавливается в свойствах оболочки (Shell)