// Um ein Fenster-Handle über den Titel des Fensters zu ermitteln
// benutzt man am einfachsten so etwas wie findwindow(nil, 'Form1').
// Was aber, wenn bei XP der User die Möglichkeit hat, den
// Fenstertitel beispielsweise bei Explorer-Fenstern zu ändern,
// indem er den kompletten Pfad in die Titelleiste setzen läßt
// bzw. das dann wieder zurücknimmt? Wenn man dann beispielsweise
// findwindow(nil, 'Programme') benutzt, wird einmal das Fenster
// gefunden und einmal nicht. Aus diesem Grund wurde die Funktion
// "FindeFenster" geschrieben.
// Getestet mit D4 unter WinME und
XP
function FindeFenster(Fenstername: PChar): THandle;
var
p: PChar;
h: THandle;
begin
result := 0;
getmem(p, max_path);
h := findwindow(nil, nil);
while h <> 0 do begin
if IsWindowVisible(h) then begin
getwindowtext(h, p, max_path);
if ansiuppercase(copy(p, length(p) - length(Fenstername) + 1, maxint))
= ansiuppercase(Fenstername)
then begin
result := h;
break;
end;
end;
h := getnextwindow(h, GW_HWNDNEXT);
end;
freemem(p);
end;
// Beispielaufruf 1:
// Ermitteln des Handles vom ersten namenlosen
// sichtbaren Fenster.
procedure TForm1.Button1Click(Sender: TObject);
var h: THandle;
begin
h := findefenster(nil);
showmessage(inttostr(h));
end;
// Beispielaufruf 2:
// Es werden Fenster geschlossen, deren Caption 'Eigene Dateien'
// heißt (meist Explorerfenster). Dabei ist es egal, ob da nur
// 'Eigene Dateien' steht, oder beispielsweise
// 'C:\Dokumente und Einstellungen\user\Eigene Dateien'.
// Über die Variable "wieviel" kann man steuern, ob alle diese
// Fenster geschlossen werden sollen (-1) oder vielleicht nur
// die beiden zuerst gefundenen (2) oder halt nur eines (1).
function closeWindows(Fenstername: pchar; wieviel: integer): integer;
var h: THandle;
begin
result := 0;
while wieviel <> 0 do begin
h := findefenster(Fenstername);
if h <> 0 then begin
if postmessage(h, wm_close, 0, 0) then begin
sleep(220);
inc(result);
if wieviel > 0 then dec(wieviel);
end;
end else wieviel := 0;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
s: string;
begin
i := closeWindows('Eigene Dateien', -1);
s := 'Es wurde';
if i <> 1 then s := s + 'n';
s := s + #32 + inttostr(i) + ' Fenster geschlossen.';
showmessage(s);
end;