// Zwei Varianten
um die Fläche der Taskbar abzufragen.
// Variante 1 benutzt zwei Funktionen (FindWindow, GetWindowRect),
// Variante 2 kommt mit einem Aufruf aus (SHAppBarMessage).
// Anschließend wird
(für beide Varianten gleichlautend)
die Lage der
Taskbar
// und die verbliebene Fläche das Schirms berechnet. Diese Funktion
wurde
// geschrieben, weil über uEdge bzw. SPI_GETWORKAREA
auf manchen Rechnern
//
falsche Ergebnisse geliefert wurden (Betriebssystem?).
// Getestet mit D4 unter Win98
uses shellapi;
var rest: TRect;
// für beide Varianten:
function bar(rec: TRect): integer;
begin
if rec.right < screen.width then begin
result := ABE_LEFT;
rest := rect(rec.right, 0, screen.width - rec.right, screen.height);
end else
if rec.left > 0 then begin
result := ABE_RIGHT;
rest := rect(0, 0, rec.left, screen.height);
end else
if rec.top > 0 then begin
result := ABE_BOTTOM;
rest := rect(0, 0, screen.width, rec.top);
end else begin
result := ABE_TOP;
rest := rect(0, rec.bottom, screen.width, screen.height - rec.bottom);
end;
end;
// Variante 1:
procedure TForm1.Button1Click(Sender: TObject);
var h: THandle;
r: TRect;
begin
h := findwindow('shell_TrayWnd', nil);
if h <> 0 then
begin
getwindowrect(h, r);
case bar(r) of // beispielsweise Position anzeigen lassen
ABE_LEFT: showmessage('links');
ABE_RIGHT: showmessage('rechts');
ABE_BOTTOM: showmessage('unten');
else showmessage('oben');
end;
end
else showmessage('Taskbar nicht gefunden');
end;
// Variante 2:
procedure TForm1.Button2Click(Sender: TObject);
var a: _AppBarData;
b: cardinal;
begin
a.cbsize := sizeof(_AppBarData);
b := SHAppBarMessage(ABM_GETTASKBARPOS, a);
if b <> 0 then begin
bar(a.rc);
// dann z.B. als weitere Möglichkeit: Fenster anpassen
setbounds(rest.left, rest.top, rest.right, rest.bottom);
end else
showmessage('Daten konnten nicht ermittelt werden');
end;
|