// 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;



Zugriffe seit 6.9.2001 auf Delphi-Ecke