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;