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.
|