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

 


Zugriffe seit 6.9.2001 auf Delphi-Ecke