Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 22

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

Π’Ρ€Π΅Ρ‚ΠΈΠΉ способ β€” Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для Π±ΡƒΡ„Π΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 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. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ BtnBuild

procedure 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 для Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠΊΠΎΠ½, поэтому ΠΈ отсСиваСм лишнСС.