Reapelări

Funcția EnumWindowsProc (Hw: hWnd; lp: lParam): Boolean; stdcall; EnumWindows () de exemplu, utilizarea funcției este dată în proiectul Back.dpr Call, al cărui cod este prezentat în Exemplul 6.9.

Listarea 6.9. MainForm.pas - Exemplul callback

Ferestre, Mesaje, SysUtils, Clase, grafică, controale,

Formulare, Dialoguri, StdCtrls, ComCtrls;

WindowName, // nume fereastră

WindowClass: String; // numele clasei a ferestrei

= Class template (TForm) lbWinInfo: TListBox; btnGetWinInfo: TButton; hdWinInfo: THeaderControl;

Procedura btnGetWinInfoClick (Expeditor: TObject);

Procedura FormDestroy (Expeditor: TObject);

Procedura lbWinInfoDrawItem (Control: TWinControl;

Index: Integer; RECT: TRect; Stat: TOwnerDrawState);

THeaderControl; Secțiunea: THeaderSection);

Funcția EnumWindowsProc (Hw: hWnd;

AMainForm: template): Boolean; stdcall;

înregistrează ferestrele active în sistem.>

WinName, CName: array [0..144] de char;

ferestre neterminate registru.>

Rezultat: = Adevărat; GetWindowText (Hw, WinName, 144); // Ia textul ferestrei curente

GetClassName (Hw, CName, 144); // Ia numele clasei ferestrei

umplut cu valori de ferestre și numele ferestrelor de nume de clasă. atunci

acest obiect este adăugat la matrice de obiecte lista ListBox1.

Ulterior, aceste valori sunt afișate în caseta listă.>

cu WindowInfo do începe

Procedura TMainForm.btnGetWinInfoClick (Expeditor: TObject);

Acesta a solicitat pentru fiecare fereastră.>

Procedura TMainForm.FormDestroy (Expeditor: TObject);

pentru i: = 0 până la lbWinInfo.Items.Count - 1 do

Procedura TMainForm.lbWinInfoDrawItem (Control: TWinControl;

Index: Integer; RECT: TRect; Stat: TOwnerDrawState);

Indicele sub numărul. Poziția de ieșire a fiecărei linii sunt determinate

cu TWindowInfo (lbWinInfo.Items.Objects [Index]) nu începe

Lungime (WindowName), Rect, dt_Left sau dt_VCenter);

HeaderControl1 pentru a determina poziția de ieșire a următoarei

Rect.Left: = Rect.Left + hdWinInfo.Sections [0] .Width;

Lungime (WindowClass), Rect, dt_Left sau dt_VCenter);

Procedura TMainForm.hdWinInfoSectionResize (HeaderControl: THeaderControl; Secțiunea: THeaderSection);

lbWinInfo.Invalidate; // Redesenați la ListBox1.

În această funcție EnumWindows aplicație () este utilizată pentru a obține numele tuturor ferestrelor de nivel superior, precum și numele claselor lor, și apoi plasat într-o listă de egalitate non-standard de obiecte în formă principală. Forma principală folosește această listă remiză non-standard pentru a afișa numele ferestrei și numele clasei ferestrei coloane separate. Dar, înainte de a înțelege modul de a crea liste personalizate cu coloane, ia în considerare metodele de utilizare a funcției de apel invers.

Utilizarea de apel invers

Listarea 6.9 arată procedura de definire a EnumWindowsProc (), în care primul parametru este mânerul ferestrei. Al doilea parametru date AUC legătură, care permite transmiterea orice valoare, dimensiunea care este echivalentă cu dimensiunea tipului de date întreg definit de utilizator.

Reamintim că, în tratare a evenimentului OnDestroy forma principală trebuie să fie eliberată de către toate instanțele TWindowInfo de clasă.

Executați aplicația, și făcând clic pe butonul în formă, puteți vedea podea

chennuyu din fiecare fereastră de informații furnizate sub forma unei liste.

Afișarea unei liste personalizate

Nume de ferestre și nume de clase de toate ferestrele de nivel superior sunt afișate într-o coloană separată în obiectul numit lbWinInfo. Acesta este - un exemplu de TListBox, în cazul în care proprietatea Style este setată la lbOwnerDraw. Dacă alegeți acest stil eveniment TListBox.OnDrawItem este generat de fiecare dată când o componentă în TListBox req Dimo ​​afișa următorul element de date. Întreaga responsabilitate pentru datele cartografice este atribuit programator, ceea ce îi permite să aleagă metoda de depunere.