Einzelnen Beitrag anzeigen

DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

Position und Größe der Taskleiste

  Alt 30. Apr 2020, 18:36
Ich habe diese beiden Funktionen um jeweils die Position und Größe der Taskleiste zu bekommen.
Die Position bekomme ich jetzt zuverlässig. Aber nicht die Größe.
Auf einem 1080p-Monitor mit 100% DPU funktioniert das wie gewollt. Auf einem 4K-Bildschirm mit 200% DPI bekomme ich aber trotzdem nur 40px für die Höhe zurück, obwohl die auf dem 4K-Bildschirm bei 200% DPI wesentlich höher ist.

GetTaskBarPos nutzte vorher auch Shell_TrayWnd. Seitdem ich das umgestellt habe, funktioniert GetTaskBarPos auch wie gewollt. Kann man GetTaskBarDimension vielleicht auch irgendwie optimieren?

Delphi-Quellcode:
function GetTaskBarPos(Handle: THandle): TTaskBarPos;
var
 tabd: TAppBarData;
begin
 Result := _BOTTOM;

 FillChar(tabd, SizeOf(TAppBarData), 0);
 tabd.cbSize := SizeOf(TAppBarData);
 if SHAppBarMessage(ABM_GETTASKBARPOS, tabd) = 0 then
  Exit;

 case tabd.uEdge of
  ABE_LEFT:
   Result := _LEFT;
  ABE_TOP:
   Result := _TOP;
  ABE_RIGHT:
   Result := _RIGHT;
  ABE_BOTTOM:
   Result := _BOTTOM;
 end;
end;

function GetTaskBarDimension(Handle: THandle): Integer;
var
 SysTray: Winapi.Windows.HWND;
 Rect: TRect;
begin
 Result := -1;
 SysTray := FindWindow('Shell_TrayWnd', nil);

 if SysTray <> INVALID_HANDLE_VALUE then
  begin
   if GetWindowRect(SysTray, Rect) then
    begin
     case GetTaskBarPos(Handle) of
      _LEFT, _RIGHT:
       if GetWindowRect(SysTray, Rect) then
        Result := Rect.Right - Rect.Left;

      _TOP:
       if GetWindowRect(SysTray, Rect) then
        Result := Rect.Bottom;

      _BOTTOM:
       if GetWindowRect(SysTray, Rect) then
        begin
         Result := Rect.Height;
        end;
     end;
    end;
  end;
end;
Ich habe zwar noch das hier, aber das funktioniert nur mit einem Monitor
Delphi-Quellcode:
var
 SysTray: Winapi.Windows.HWND;
 Rect: TRect;
begin
 Result := -1;

 if SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0) then
  begin
   case GetTaskBarPos(Handle) of
    _LEFT, _RIGHT:
     Result := Rect.Right - Rect.Left;

    _TOP:
     Result := Rect.Top;

    _BOTTOM:
     Result := Rect.Bottom;
   end;
  end;

Geändert von DieDolly (30. Apr 2020 um 18:54 Uhr)
  Mit Zitat antworten Zitat