Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Position und Größe der Taskleiste (https://www.delphipraxis.net/204164-position-und-groesse-der-taskleiste.html)

DieDolly 30. Apr 2020 18:36


Position und Größe der Taskleiste
 
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;

Uwe Raabe 30. Apr 2020 21:18

AW: Position und Größe der Taskleiste
 
Ist bei dem Programm, das diesen Code enthält, denn auch die DPI-Awareness aktiv?

DieDolly 30. Apr 2020 21:28

AW: Position und Größe der Taskleiste
 
Das ist aktiv. Ich glaube ich habe jetzt zwei Funktionen die eigentlich ganz gut mit Multimonitor und HIghDPI funktionieren sollten. Schade nur, dass ich Handle in GetTaskBarPos nicht verwenden kann. Aber die Taskbar sollte eigentlich auf allen Monitoren da sein, wo sie auf Monitor 0 auch ist.

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
 aScreen: TMonitor;
begin
 Result := -1;

 aScreen := Screen.MonitorFromWindow(Handle);

 case GetTaskBarPos(Handle) of
  _RIGHT, _LEFT:
   Result := aScreen.Width - aScreen.WorkAreaRect.Width;

  _TOP:
   Result := aScreen.WorkAreaRect.Top;

  _BOTTOM:
   Result := aScreen.Height - aScreen.WorkAreaRect.Bottom;
 end;
end;

Uwe Raabe 30. Apr 2020 23:10

AW: Position und Größe der Taskleiste
 
Wenn man davon ausgeht, daß das TaskBarRect plus das WorkAreaRect den gesamten Bildschirm ergibt, dann geht auch folgender Code (einer der beiden Klammerausdrücke ist 0):
Delphi-Quellcode:
function GetTaskBarDimension(Handle: THandle): Integer;
var
  aScreen: TMonitor;
begin
  aScreen := Screen.MonitorFromWindow(Handle);
  Result := (aScreen.Width - aScreen.WorkAreaRect.Width) +
            (aScreen.Height - aScreen.WorkareaRect.Height);
end;
Klappt natürlich nicht, wenn es noch andere AppBars gibt. Aber das gilt für deinen Code dann eventuell auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz