![]() |
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:
Ich habe zwar noch das hier, aber das funktioniert nur mit einem Monitor
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;
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; |
AW: Position und Größe der Taskleiste
Ist bei dem Programm, das diesen Code enthält, denn auch die DPI-Awareness aktiv?
|
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; |
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:
Klappt natürlich nicht, wenn es noch andere AppBars gibt. Aber das gilt für deinen Code dann eventuell auch.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz