Получить положение панели задач? - PullRequest
1 голос
/ 03 июля 2011

У меня есть основное приложение, скрытое с помощью:

Application.ShowMainForm:= False;

Приложение использует TTrayIcon, которому я назначил всплывающее меню.

Используя и выбрав одно из всплывающих меню взначок на панели задач. Я хочу, чтобы мое приложение снова стало видимым, но я хочу, чтобы положение приложения отображалось над панелью задач.

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

Проще говоря, я хочу, чтобы мое приложение появилось в углупанели задач выше (или далее) системных часов.

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 03 июля 2011

Используйте SHAppBarMessage, чтобы получить расположение панели задач:

SHAppBarMessage(ABM_GETTASKBARPOS, appBarData);

Что вместе с размером «основного» монитора:

nScreenWidth := GetSystemMetrics(SM_CXSCREEN);
nScreenHeight := GetSystemMetrics(SM_CYSCREEN);

, и вы можете работать, если Панель задач расположена в

  • вверху
  • слева
  • внизу
  • вправо

экрана и его размер.

{Calculate taskbar position from its window rect. However,
 on XP it may be that the taskbar is slightly larger or smaller than the
 screen size. Therefore we allow some tolerance here.
}
if NearlyEqual(rcTaskbar.Left, 0, TASKBAR_X_TOLERANCE) and
        NearlyEqual(rcTaskbar.Right, nScreenWidth, TASKBAR_X_TOLERANCE) then
begin
    // Taskbar is on top or on bottom
    if NearlyEqual(rcTaskbar.Top, 0, TASKBAR_Y_TOLERANCE) then
        FTaskbarPlacement := ABE_TOP
    else
        FTaskbarPlacement := ABE_BOTTOM;
end
else
begin
    // Taskbar is on left or on right
    if NearlyEqual(rcTaskbar.Left, 0, TASKBAR_X_TOLERANCE) then
        FTaskbarPlacement := ABE_LEFT
    else
        FTaskbarPlacement := ABE_RIGHT;
end;

С этим вы можете поднять свой тост:

case FTaskbarPlacement 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
    // Taskbar is on the bottom or Invisible
    Self.Left := rcTaskbar.Right - Self.Width;
    Self.Top := rcTaskbar.Top - Self.Height;
 end;

enter image description here

5 голосов
/ 03 июля 2011

В Windows 7 вы можете позвонить Shell_NotifyIconGetRect().

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

0 голосов
/ 15 декабря 2016

Создать TForm во время выполнения

также может установить AlphaBlendValue 0 для прозрачности и TRUE для AlphaBlend

, но в основном это настройки WindowState:=wsMaximized; и visible:=FALSE;, то какими бы ни были позиции панели задач,просто получите верхнюю \ левую \ ширину \ высоту этой формы

, а затем просто отрегулируйте позицию приложения по этой ссылке;

...