AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Position und Größe der Taskleiste

Ein Thema von DieDolly · begonnen am 30. Apr 2020 · letzter Beitrag vom 30. Apr 2020
Antwort Antwort
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
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#2

AW: Position und Größe der Taskleiste

  Alt 30. Apr 2020, 21:18
Ist bei dem Programm, das diesen Code enthält, denn auch die DPI-Awareness aktiv?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

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

AW: Position und Größe der Taskleiste

  Alt 30. Apr 2020, 21:28
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#4

AW: Position und Größe der Taskleiste

  Alt 30. Apr 2020, 23:10
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 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