19/05/2001
Par Maxence Delannoy
WindowsIl faut utiliser l'API EnumWindows. Cette fonction utilise une fonction d'appel en retour (CallBack) qui est appelé à chaque fois qu'une fenêtre est trouvée. La directive StdCall doit être employée pour que l'appel de fonction se fasse correctement. Le titre des fenêtres est obtenu grace à l'utilisation des APIs GetWindowTextLength et GetWindowText. Exemple : Placez une ListBox sur une fiche, puis tapez le code suivant dans l'éditeur de code. { Liste les noms des fenêtres (de niveau supérieure) existantes } unit EnumWinMainForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; procedure FormCreate(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } end; function CallBack(Window: HWnd; P: LParam): Boolean; stdcall; var Form1: TForm1; implementation {$R *.DFM} function CallBack(Window: HWnd; P: LParam): Boolean; var l: Integer; Title: string; begin l := GetWindowTextLength(Window); // Retrouve la longueur maximale du texte if l > 0 then begin SetLength(Title, l + 1); // Ajout d'un caractère pour le #0 terminal GetWindowText(Window, PChar(Title), Length(Title)); // Récupère le texte Title := PChar(Title); // Ajuste la longueur de la chaine TListBox(P).Items.Add(Title); end else TListBox(P).Items.Add('[Aucun nom n''a été donné à cette fenêtre]'); Result := True; end; procedure TForm1.FormCreate(Sender: TObject); var P: LParam; begin P := LongInt(ListBox1); // On passe un pointeur sur la ListBox EnumWindows(@CallBack, P); end; end. Nota : On aurait également pu utiliser les messages Windows WM_GETTEXTLENGTH et WM_GETTEXT. LinuxOn peut récupérer un tableau de pointeur sur les fenêtres enfants d'une certaine fenêtre en utilisant l'API XQueryTree de l'unité Xlib. Ensuite, à partir de ce tableau, on peut utiliser l'API XFetchName pour obtenir le nom de la fenêtre. Exemple : { Liste les noms des fenêtres X Window (de niveau supérieur) existantes } program XQueryT; uses Xlib; var Dpy: PDisplay; // Pointeur sur une structure TDisplay n: Cardinal; RootWin, ParentWin: TWindow; Wins: PWindow; // Pointeur sur le 1er élément d'un tableau de pointeurs Win: PWindow; i: Cardinal; Status: TStatus; Name: PChar; begin Dpy := XOpenDisplay(nil); // Connexion au serveur X { On récupère l'adresse du tableau de pointeurs qui nous permet d'accéder aux différentes structure de type TWindow } XQueryTree(Dpy, XRootWindow(Dpy, XDefaultScreen(Dpy)), @RootWin, @ParentWin, @Wins, @n); try Writeln(n, ' fenêtres'); Writeln(''); i := 0; Win := Wins; while i < n do begin Status := XFetchName(Dpy, Win^, @Name); case Status of 0: Writeln(i, ': ', '[Aucun nom n''a été donné à cette fenêtre]'); BadWindow: Writeln(i, ': ', '[Mauvaise fenêtre]'); else begin Writeln(i, ': ', Name); XFree(Name); // Libère la mémoire interne au serveur X end; end; Inc(Win); // Passe au pointeur suivant du tableau Inc(i); end; finally XFree(Wins); // Libère la mémoire interne au serveur X occupée par le tableau end; XCloseDisplay(Dpy); // Termine la connexion end.
|