IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Lister les fenêtres de niveau supérieur

19/05/2001

Par Maxence Delannoy

Windows

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

Linux

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

Précédent Retour à la table des matières Suivant