Π’ΡΠ΅ΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± β Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ Π±ΡΡΠ΅ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ StrAlloc ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΌΡΡΡ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ StrDispose. ΠΡΠΈ ΡΡΠΎΠΌ ΠΊΡΠ°ΠΉΠ½Π΅ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ try/finally, ΡΡΠΎΠ±Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΡΡΠ΅ΡΠΊΠ°ΠΌ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΡΠ΅ ΡΡΠΈ ΡΠΏΠΎΡΠΎΠ±Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠΎΠΊΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ Windows API ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ EnumWnd, Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅ΠΌΡΡ Π½Π° ΠΏΡΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅.
1.2. ΠΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Windows API
Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½Ρ ΠΏΡΠΎΡΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠ΅ΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅. ΠΡΠ΅ ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈΡΡ ΡΠ°Π½Π΅Π΅, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π²Π·ΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ API. ΠΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΠΎΠ±ΠΎΠ±ΡΠ°ΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΡΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ API ΠΈ VCL, ΠΏΠΎΡΠ²ΡΡΠ΅Π½ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ, ΡΡΠ΅ΡΠΈΠΉ ΡΠ°Π·Π΄Π΅Π» Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Ρ.
1.2.1. ΠΡΠΈΠΌΠ΅Ρ EnumWnd
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° EnumWnd ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ EnumWindows ΠΈ EnumChildWindows, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΡΠΈΡ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠ΅Ρ Π²ΡΠ΅ ΠΎΠΊΠ½Π°, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΈΡ Π² Π²ΠΈΠ΄Π΅ Π΄Π΅ΡΠ΅Π²Π°: ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π» Π΄Π΅ΡΠ΅Π²Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΎΠΊΠ½Ρ, Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ·Π»Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌ ΠΎΠΊΠ½Π°ΠΌ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° (ΡΠΈΡ. 1.8).
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° EnumWnd ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΡΠΈΠΏΠ° LPTSTR, ΡΠ΅ΡΠ΅Π· ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Windows API Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΡΡΠΎΠΊΠΎΠ²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. Π ΡΠ°Π·Π΄. 1.1.13 Π±ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ ΡΡΠΈ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ: Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ Π² ΡΡΠ΅ΠΊΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΈΠΏΠ° Char, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ ΡΠΈΠΏΠ° string ΠΈ ΡΡΡΠΎΠΊ ΡΠΈΠΏΠ° PChar. ΠΡΠ΅ ΡΡΠΈ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ EnumWnd. ΠΠ° Π³Π»Π°Π²Π½ΠΎΠΉ ΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠΎΡΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ EnumWnd ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Ρ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°: TreeWindow ΡΠΈΠΏΠ° TTreeView ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° BtnBuild. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΎΡΠ΅Π½Ρ Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΠΎ (Π»ΠΈΡΡΠΈΠ½Π³ 1.21).
ΠΠΈΡΡΠΈΠ½Π³ 1.21. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ BtnBuildprocedure TFomWindows.BtnBuildClick(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
try
TreeWindows.Items.Clear;
EnumWindows(@EnumWindowsProc, 0);
finally
Screen.Cursor := crDefault;
end;
end;
Π ΠΈΡ. 1.8. ΠΠΊΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ EnumWnd
ΠΡΠ΅, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, β ΡΡΠΎ ΠΎΡΠΈΡΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ TreeWindows ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ EnumWindows, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° EnumWindowsProc, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ°. Π‘ΡΠ°Π·Ρ ΠΎΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π»Ρ EnumWindows, ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ EnumWindowsProc. Π‘Π°ΠΌΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π»ΠΈΡΡΠΈΠ½Π³ 1.22).
ΠΠΈΡΡΠΈΠ½Π³ 1.22. Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° EnumWindowsProc (ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ)// ΠΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ EnumWindows ΠΈ EnumChildWindows.
// Π’ΠΈΠΏ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΡΠΈΠΏΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ
// ΡΠΊΠ°Π·Π°Π½ MSDN. ΠΠ΄Π½Π°ΠΊΠΎ TTreeNode, ΠΊΠ°ΠΊ ΠΈ Π»ΡΠ±ΠΎΠΉ ΠΊΠ»Π°ΡΡ,
// ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²Π΅Π·Π΄Π΅,
// Π³Π΄Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π΅ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ - Π½Π° Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΌ
// ΡΡΠΎΠ²Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ Π½Π΅Ρ ΡΠ°Π·Π½ΠΈΡΡ. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ
// ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π² EnumWindows ΠΈ EnumChildWindows Π²
// ΠΌΠΎΠ΄ΡΠ»Π΅ Windows.dcu ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΠΊΠ°ΠΊ Π½Π΅ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ
// ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ
// ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° Π·Π°ΡΠ²Π»Π΅Π½Π½ΠΎΠΌΡ.
function EnumWindowsProc(Wnd: HWND; ParentNode: TTreeNode): Bool; stdcall;
// Π‘ΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠ²Π°
// Π΄Π»ΠΈΠ½Π° ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ»Π°ΡΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ
// ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²ΡΠ΄Π΅Π»ΡΡΡ Π±ΡΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ Π΄Π»ΠΈΠ½Ρ Π² Π½Π°Π΄Π΅ΠΆΠ΄Π΅, ΡΡΠΎ
// ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° Π½Π΅ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π΅ΡΠ΅ Π΄Π»ΠΈΠ½Π½Π΅Π΅. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅
// ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ ClassNameLen.
// ΠΡΠ°ΠΉΠ½Π΅ ΠΌΠ°Π»ΠΎΠ²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° ΡΠΊΠ°ΠΆΠ΅ΡΡΡ Π΄Π»ΠΈΠ½Π½Π΅Π΅,
// ΡΠ΅ΠΌ 511 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (512-ΠΉ Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠ΅Π³ΠΎ
// Π½ΡΠ»Π΅Π²ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°).
const
ClassNameLen = 512;
var
// ΠΠ΄Π΅ΡΡ Π±ΡΠ΄Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°
Text: string;
TextLen: Integer;
// ΠΡΠΎ - Π±ΡΡΠ΅Ρ Π΄Π»Ρ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ»Π°ΡΡΠ°
ClassName: array[0..ClassNameLen - 1] of Char;
Node: TTreeNode;
NodeName: string;
begin
Result := True;
// Π€ΡΠ½ΠΊΡΠΈΡ EnumChildWindows ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΠ΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ
// Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π½ΠΎ ΠΈ
// Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π΅Π³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΎΠΊΠΎΠ½ ΠΈ Ρ.ΠΏ. ΠΠΎ ΠΏΡΠΈ
// ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ Π΄Π΅ΡΠ΅Π²Π° Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ
// ΠΏΡΡΠΌΡΠ΅ ΠΏΠΎΡΠΎΠΌΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ΅ ΠΎΠΊΠ½Π°, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΠΏΡΡΠΌΡΠΌΠΈ
// ΠΏΠΎΡΠΎΠΌΠΊΠ°ΠΌΠΈ, ΠΌΡ Π·Π΄Π΅ΡΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ.
if Assigned(ParentNode) and (GetParent(Wnd) <> HWND(ParentNode.Data)) then Exit;
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄Π»ΠΈΠ½Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π°. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ
// GetWindowText ΠΈ GetWindowTextLength ΠΌΡ Π·Π΄Π΅ΡΡ
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_GETTEXT ΠΈ WM_GETTEXTLENGTH,
// ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π½Π΅
// ΡΠΌΠ΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ,
// ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌ ΡΡΠΆΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ².
TextLen := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
// Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ
// Π±ΡΠ΄Π΅Ρ ΡΠ»ΡΠΆΠΈΡΡ Π±ΡΡΠ΅ΡΠΎΠΌ Π΄Π»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π°.
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ SetLength Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ
// Π²ΡΠ΄Π΅Π»Π΅Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π½Π΅
// Π±ΡΠ΄Π΅Ρ Π΄ΡΡΠ³ΠΈΡ ΡΡΡΠ»ΠΎΠΊ.
SetLength(Text, TextLen);
// ΠΡΠ»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° - ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ°, TextLen Π±ΡΠ΄Π΅Ρ
// ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0, ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Text ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ
// Set Length ΠΏΠΎΠ»ΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ nil. ΠΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅
// ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_GETTEXT ΠΎΠΊΠΎΠ½Π½Π°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
// ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΡΠΎΠΊΡ ΠΏΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ,
// Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° ΠΏΡΡΡΠΎΠΉ - Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²
// ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ Π±ΡΡΠ΅Ρ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΈΡΠ°Π½ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ» -
// Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ Π½ΠΎΠ»Ρ. ΠΠΎ Π΅ΡΠ»ΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ nil, ΡΠΎ
// ΠΏΠΎΠΏΡΡΠΊΠ° Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎ-ΡΠΎ Π² ΡΠ°ΠΊΠΎΠΉ Π±ΡΡΠ΅Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ
// Access violation, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΎΠΊΠ½Ρ WM_GETTEXT
// ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ TextLen > 0.
if TextLen > 0 then
SendMessage(Wnd, WM_GETTEXT, TextLen + 1, LParam (Text));
// ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ Π΄Π»ΠΈΠ½Π½ΡΠΌ - Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²
// Memo Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ΡΡΠΈΡΠ°Π΅ΡΡΡ Π²Π΅ΡΡ ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΌ
// Π΅ΡΡΡ. ΠΡΠ°ΠΊΡΠΈΠΊΠ° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
// ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π² TTreeView ΡΠ·Π»ΠΎΠ² Ρ ΠΎΡΠ΅Π½Ρ Π΄Π»ΠΈΠ½Π½ΡΠΌ
// Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ: ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΎΡΠΊΡΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠ·Π΅Π» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°,
// Π·Π°ΠΏΡΡΠ΅Π½Π½Π°Ρ ΠΈΠ· Delphi, Π²ΡΠ»Π΅ΡΠ°Π΅Ρ Π² ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ (ΠΏΡΠΈ
// Π·Π°ΠΏΡΡΠΊΠ΅ Π²Π½Π΅ ΡΡΠ΅Π΄Ρ Delphi ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΎ). Π§ΡΠΎΠ±Ρ
// ΡΡΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΎ, ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ
// ΠΎΠ±ΡΠ΅Π·Π°ΡΡΡΡ.
if TextLen > 100 then
Text := Copy(Text, 1, 100) + '...';
GetClassName(Wnd, ClassName, ClassNameLen);
ClassName[ClassNameLen - 1] := #0;
if Text = '' then NodeName := 'ΠΠ΅Π· Π½Π°Π·Π²Π°Π½ΠΈΡ (' + ClassName + ') '
else NodeName := Text + ' (' + ClassName + ')';
Node := FormWindows.TreeWindows.Items.AddChild(ParentNode, NodeName);
// ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² Π΄Π°Π½Π½ΡΠ΅ ΡΠ·Π»Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ
// Π΅ΠΌΡ ΠΎΠΊΠ½Π°, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠ±ΡΠΎΡΠΈΡΡ Π½Π΅ΠΏΡΡΠΌΡΠ΅
// ΠΏΠΎΡΠΎΠΌΠΊΠΈ.
Node.Data := Pointer(Wnd);
// ΠΡΠ·ΡΠ²Π°Π΅ΠΌ EnumChildWindows, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
// EnumWindowsProc Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π°
// ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΠ·Π΅Π» - Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
// ΠΡΠΈ ΡΡΠΎΠΌ EnumWindowsProc Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΈΠ·
// EnumChildWindows, Ρ.Π΅. ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΡ.
EnumChildWindows(Wnd, @EnumWindowsProc, LParam(Mode));
end;
ΠΠ°ΠΊ ΠΌΡ ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π΄Π»Ρ EnumWindows ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π° Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ 4-Π±Π°ΠΉΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ, ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΡΡ ΡΡΠ΄Π° ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ EnumWindows ΠΈΠ»ΠΈ EnumChildWindows. ΠΡ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ ΡΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠ·Π΅Π» Π΄Π΅ΡΠ΅Π²Π°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌΡ ΠΎΠΊΠ½Ρ. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌΡΡ, ΡΡΠΎ Π² ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Data ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ·Π»Π° Π±ΡΠ΄Π΅ΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ Π½ΠΈΠΌ ΠΎΠΊΠ½Π°. ΠΠ»Ρ ΠΎΠΊΠΎΠ½ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ ΡΡΡΠ»ΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ nil β ΡΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ EnumWindows Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 1.21).
Π Π°Π±ΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΎΠΊΠ½ΠΎΠΌ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ ΠΎΠΊΠ½ΠΎ, ΡΠ΅ΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ²ΡΠ·Π°Π½ Ρ ΡΠ·Π»ΠΎΠΌ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. ΠΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½ΡΠΆΠ½Π° ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ EnumChildWindows ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΠ΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅, Π½ΠΎ ΠΈ "Π²Π½ΡΡΠ°ΡΡΠ΅", "ΠΏΡΠ°Π²Π½ΡΡΠ°ΡΡΠ΅" ΠΈ Ρ.Π΄. ΠΎΠΊΠ½Π°. ΠΠ°ΠΌ Π·Π΄Π΅ΡΡ ΡΡΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠ΅ "Π΄Π΅ΡΠΈ" ΠΎΠΊΠ½Π°, Π° Π΄ΠΎ "Π²Π½ΡΠΊΠΎΠ²" ΠΌΡ Π΄ΠΎΠ±Π΅ΡΠ΅ΠΌΡΡ, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ·ΠΎΠ²Π΅ΠΌ EnumChildWindows Π΄Π»Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΎΠΊΠΎΠ½, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈ ΠΎΡΡΠ΅ΠΈΠ²Π°Π΅ΠΌ Π»ΠΈΡΠ½Π΅Π΅.