Вопрос пользователя заключается в том, как сделать так, чтобы скрытое приложение на Delphi, использующее компонент TTrayIcon, появлялось в определенной зоне экрана, а именно рядом с системным треем (taskbar) в Windows. Это особенно важно, так как пользователь может изменить расположение taskbar, и приложению необходимо корректно реагировать на эти изменения.
Решение проблемы
Для решения этой задачи можно использовать функцию SHAppBarMessage с параметром ABM_GETTASKBARPOS, которая позволяет получить информацию о расположении taskbar. Сочетание этой информации с размерами основного монитора позволяет определить, находится taskbar в верхней, левой, нижней или правой части экрана, а также его размеры.
Пример кода на Object Pascal
uses
Winapi.ShellApi;
type
TTaskbarPlacement = (ABE_TOP, ABE_LEFT, ABE_BOTTOM, ABE_RIGHT);
var
appBarData: TRect;
nScreenWidth, nScreenHeight: Integer;
FTaskbarPlacement: TTaskbarPlacement;
TASKBAR_X_TOLERANCE, TASKBAR_Y_TOLERANCE: Integer = 5;
procedure TForm1.FormCreate(Sender: TObject);
begin
nScreenWidth := GetSystemMetrics(SM_CXSCREEN);
nScreenHeight := GetSystemMetrics(SM_CYSCREEN);
appBarData := Rect(0, 0, 0, 0);
if SHAppBarMessage(ABM_GETTASKBARPOS, appBarData) <> S_OK then
Exit;
// Вычисление положения taskbar
if NearlyEqual(appBarData.Left, 0, TASKBAR_X_TOLERANCE) and
NearlyEqual(appBarData.Right, nScreenWidth, TASKBAR_X_TOLERANCE) then
begin
// Taskbar находится сверху или снизу
if NearlyEqual(appBarData.Top, 0, TASKBAR_Y_TOLERANCE) then
FTaskbarPlacement := ABE_TOP
else
FTaskbarPlacement := ABE_BOTTOM;
end
else
begin
// Taskbar находится слева или справа
if NearlyEqual(appBarData.Left, 0, TASKBAR_X_TOLERANCE) then
FTaskbarPlacement := ABE_LEFT
else
FTaskbarPlacement := ABE_RIGHT;
end;
end;
procedure TForm1.ShowNotificationAreaPopup(const APlacement: TTaskbarPlacement);
var
rcTaskbar: TRect;
begin
// Предполагаем, что rcTaskbar уже заполнен актуальными размерами taskbar
case APlacement of
ABE_RIGHT:
begin
Self.Left := rcTaskbar.Left - Self.Width;
Self.Top := rcTaskbar.Bottom - Self.Height;
end;
ABE_LEFT:
begin
Self.Left := rcTaskbar.Right;
Self.Top := rcTaskbar.Bottom - Self.Height;
end;
ABE_TOP:
begin
Self.Left := rcTaskbar.Right - Self.Height;
Self.Top := rcTaskbar.Bottom;
end;
else //ABE_BOTTOM
begin
// Taskbar находится снизу или не виден
Self.Left := rcTaskbar.Right - Self.Width;
Self.Top := rcTaskbar.Top - Self.Height;
end;
end;
end;
procedure TForm1.TrayIconClick(Sender: TObject);
begin
// Показать форму в районе системного трея
ShowNotificationAreaPopup(FTaskbarPlacement);
end;
Подводящий итог
Используя приведенный выше код, вы можете управлять позиционированием вашего приложения так, чтобы оно появлялось рядом с системным треем, вне зависимости от того, как пользователь расположил taskbar на экране. Это полезно для создания интуитивно понятного и удобного пользовательского интерфейса, особенно для всплывающих уведомлений и небольших окон.
Приложение на Delphi с использованием компонента `TTrayIcon` должно динамически изменять своё положение на экране, чтобы появляться рядом с системным треем, учитывая его расположение и размеры.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.