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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 44

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ Ρ‚Π΅ΠΌΠ΅ располоТСния Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ зададимся вопросом: ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ DLL? Π§Π΅ΠΌ ΠΏΠ»ΠΎΡ…ΠΎ располоТСниС Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π² Π•Π₯Π•-ΠΌΠΎΠ΄ΡƒΠ»Π΅ прилоТСния? Π‘Π°ΠΌΠΎΠ΅ врСмя Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс Π² Windows выполняСтся Π² своСм собствСнном адрСсном пространствС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ адрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ адрСсом структуры Π΄Π°Π½Π½Ρ‹Ρ… Π³Π΄Π΅-Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса (рис. 10.1).

Рис. 10.1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ адрСсного пространства Ρ€Π°Π·Π½Ρ‹Ρ… процСссов

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π•Π₯Π•-Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ„Π°ΠΉΠ»Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ΅Ρ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² адрСсноС пространство ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ… процСсса. РазмСстив Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π² DLL ΠΈ ΡƒΠΊΠ°Π·Π°Π² дСскриптор модуля этой DLL, ΠΌΡ‹ прСдоставляСм систСмС ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° смогла:

β€’ ΡΠΏΡ€ΠΎΠ΅Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с Π»ΠΎΠ²ΡƒΡˆΠΊΠΎΠΉ Π² адрСсноС пространство исслСдуСмого процСсса;

β€’ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (адрСс) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π² адрСсном пространствС исслСдуСмого процСсса.

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ манипуляции с DLL ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° рис. 10.2 (ΠŸΡ€ΠΎΡ†Π΅ΡΡ 2 Π½Π° рисункС – процСсс, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ внСдряСтся Π»ΠΎΠ²ΡƒΡˆΠΊΠ°).

Рис. 10.2. Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° DLL с Π»ΠΎΠ²ΡƒΡˆΠΊΠΎΠΉ Π² адрСсноС пространство исслСдуСмого процСсса

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… прСпятствий Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΏΡ€ΠΈ наблюдСнии Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом.

...

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ рСализуСтся функция DIIMain, вызываСмая (ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ) ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅/Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π–Π°Π»ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ описанном способС ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΊΠΈ DLL эта функция Π½Π΅ вызываСтся. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π°Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ, Π² Ρ‡Π΅ΠΌ Π²Ρ‹ смоТСтС вскорС ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ.

10.2. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Β«ΠžΠΊΠΎΠ½Π½Ρ‹ΠΉ шпион»

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΊ практичСской части Π³Π»Π°Π²Ρ‹: рассмотрим созданиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ список (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, Π΄Π΅Ρ€Π΅Π²ΠΎ) всСх ΠΎΠΊΠΎΠ½, ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… свойства, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ сообщСний Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° (Π½Π΅Π΄Π°Ρ€ΠΎΠΌ ΠΌΡ‹ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π½Π° рассмотрСниС Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ Windows).

НСсмотря Π½Π° своС Β«ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠ·Π°ΠΊΠΎΠ½Π½ΠΎΠ΅Β» Π½Π°Π·Π²Π°Π½ΠΈΠ΅, рассматриваСмая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ вСсьма ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π° ΠΎΡ‚Π½ΡŽΠ΄ΡŒ Π½Π΅ΠΏΡ€ΠΈ ΠΈΡ… Π²Π·Π»ΠΎΠΌΠ΅ ΠΈ шпионаТС (хотя ΠΌΠ½ΠΎΠ³ΠΎΠ΅ зависит ΠΎΡ‚ добросовСстности Π»ΠΈΡ†Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ). Π’ частности, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Ρ‹Π»Π° Π½Π°ΠΉΠ΄Π΅Π½Π° ошибка, Π½Π° Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя Π·Π°ΠΊΡ€Π°Π²ΡˆΠ°ΡΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π³Π». 2: ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ установки стилСй ΠΏΡ€ΠΈ Ρ€ΡƒΡ‡Π½ΠΎΠΌ создании Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΡƒΠ΄Π°Π²Π°Π»ΠΎΡΡŒ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ пСрСрисовки элСмСнта управлСния Β«Ρ€Π°ΠΌΠΊΠ°Β».

БоставлСниС списка ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΎΠΊΠΎΠ½

Бписок (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, Π΄Π΅Ρ€Π΅Π²ΠΎ) ΠΎΠΊΠΎΠ½, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 10.3.

Рис. 10.3. Π”Π΅Ρ€Π΅Π²ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΎΠΊΠΎΠ½

Π€ΠΎΡ€ΠΌΠ°, показанная Π½Π° рис. 10.3, ΠΈΠΌΠ΅Π΅Ρ‚ имя f rmMain. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ управлСния TreeView ΠΈΠΌΠ΅Π΅Ρ‚ имя tree. Π§Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π°Ρ Π·Π° построСниС Π΄Π΅Ρ€Π΅Π²Π°, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ проста. Она ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ вскользь рассмотрСнный Π² Π³Π».2 ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ пСрСчислСния ΠΎΠΊΠΎΠ½. БоставлСниС Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠΊΠΎΠ½ начинаСтся с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ LoadWindowsTree, которая ΠΈ запускаСт пСрСчислСниС ΠΎΠΊΠΎΠ½ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠΊΠΎΠ½, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ являСтся ΠΎΠΊΠ½ΠΎ Π Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола (листинг 10.1).

...

Листинг 10.1. Начало составлСния Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠΊΠΎΠ½

procedure TfrmMain.LoadWindowsTree();

var

desktop: TTreeNode;

//enInfo: TEnumInfo;

begin

tree.Items.Clear;

//Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° для Π Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола

desktop := tree.Items.Add(tree.Items.GetFirstNode, \'Π Π°Π±ΠΎΡ‡ΠΈΠΉ

стол\');

//ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΎΠΊΠΎΠ½

enInfo.tree := tree;

enInfo.parent := desktop;

EnumWindows(Addr(NewWindow), Integer(Addr(enInfo)));

end;

Π‘Ρ€Π°Π·Ρƒ слСдуСт привСсти объявлСниС структуры, интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ (Π΄Π°Π»Π΅Π΅ это Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π½ΠΎ) ΠΏΡ€ΠΈ составлСнии Π΄Π΅Ρ€Π΅Π²Π°:

...

Type

TEnumInfo = Record

tree: TTreeView; //ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TreeView

parent: TTreeNode; //Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π΄Π΅Ρ€Π΅Π²Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ

//Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΎΠΊΠ½Ρƒ, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅

//ΠΎΠΊΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ

end;

ΠŸΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° вызываСтся функция NewWindow (Π΅Π΅ адрСс ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ EnumWindows). Ѐункция NewWindow (листинг 10.2) Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π΄Π²Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ½Π° добавляСт Π² Π΄Π΅Ρ€Π΅Π²ΠΎ элСмСнт, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, запускаСт поиск Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠΊΠΎΠ½ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ всС ΠΎΠΊΠ½Π° (ΠΎΡ‚ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ прилоТСния Π΄ΠΎ ΠΊΠ½ΠΎΠΏΠΎΠΊ, надписСй ΠΈ Ρ‚. Π΄.).

...

Листинг 10.2.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΠΊΠ½Π΅ ΠΈ поиск Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠΊΠΎΠ½

function NewWindow(wnd: HWND; param: LPARAM):BOOL; stdcall;

var

wndNode, parentNode: TTreeNode;

begin

wndNode := AddWindowToTree(wnd); //Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ±

ΠΎΠΊΠ½Π΅ Π² Π΄Π΅Ρ€Π΅Π²ΠΎ

//ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠΊΠΎΠ½

parentNode := enInfo.parent;

enInfo.parent := wndNode;

EnumChildWindows(wnd, Addr(NewWindow), param);

enInfo.parent := parentNode;

//ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ пСрСчислСниС (послС пСрСчислСния

//всСх Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠΊΠΎΠ½)

NewWindow := True;

end;

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² листингС 10.3 функция AddWindowToTree добавляСт элСмСнт, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ, Π² Π΄Π΅Ρ€Π΅Π²ΠΎ (опрСдСляСт тСкст Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π° ΠΈ имя ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ класса):

...

Листинг 10.3.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнта, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Ρƒ, Π² Π΄Π΅Ρ€Π΅Π²ΠΎ

function AddWindowToTree(wnd: HWND): TTreeNode;

var

caption, classname: String;

text: String;

node: TTreeNode;

begin

//ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ тСкста ΠΎΠΊΠ½Π°

SetLength(caption, SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0) + 1);

SetLength(caption, SendMessage(wnd, WM_GETTEXT, Length(caption),

Integer(PAnsiChar(caption))));

//Имя класса окна

SetLength(classname, 1024);

SetLength(classname, GetClassName(wnd, PAnsiChar(classname),

100));

//Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ тСкста для элСмСнта ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ Π² Π΄Π΅Ρ€Π΅Π²ΠΎ

text := \'"\' + caption + \'" \' + classname;

node := enInfo.tree.Items.AddChild( enInfo.parent, text );

node.Data := Pointer(wnd); //НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ

//дСксриптор ΠΎΠΊΠ½Π°

AddWindowToTree := node;

end;

Π’ΠΎΡ‚, собствСнно, ΠΈ всС, Ρ‡Ρ‚ΠΎ трСбуСтся для построСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠΊΠΎΠ½, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° рис. 10.3.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΠΊΠ½Π΅

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Β«ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ шпиона» являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΠΊΠ½Π΅, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ Π² Π΄Π΅Ρ€Π΅Π²Π΅. Π€ΠΎΡ€ΠΌΠ° с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΎΠΊΠ½Π΅ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это прСсловутая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠŸΡƒΡΠΊ) ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° рис. 10.4.

Рис. 10.4. Π€ΠΎΡ€ΠΌΠ° свойств ΠΎΠΊΠ½Π°

НачинаСтся всС с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ мСню ΠŸΡ€Π°Π²ΠΊΠ° β†’ Бвойства вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ ShowWindowProp созданного ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° f rmWindowProp. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° дСскриптор ΠΎΠΊΠ½Π°, ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ (дСскриптор сохраняСтся Π² ΠΏΠΎΠ»Π΅ Data ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΏΡ€ΠΈ построСнии Π΄Π΅Ρ€Π΅Π²Π°) (листинг 10.4).

...

Листинг 10.4.

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Ρ„ΠΎΡ€ΠΌΡ‹ свойств Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

procedure TfrmWindowProp.ShowWindowProp(window: HWND);

begin

wnd := window;

LoadWindowInfo();

ShowModal(); //НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ сами сСбя

end;

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ wnd, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сохраняСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ BShowWindowProp дСскриптор ΠΎΠΊΠ½Π°, являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ класса Tf rmWindowProp. Она Π½ΡƒΠΆΠ½Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ„ΠΎΡ€ΠΌΡ‹ Tf rmWindowProp ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ дСскриптору ΠΎΠΊΠ½Π°.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, ΠΈΠΌΠ΅Π½ΠΈ класса, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΎΠΊΠ½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ области экрана, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ ΠΎΠΊΠ½ΠΎΠΌ, осущСствляСтся Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ LoadWindowInf ΠΎ (листинг 10.5).

...

Листинг 10.5.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΠΊΠ½Π΅

procedure TfrmWindowProp.LoadWindowInfo();

var

rect: TRect;

buffer: String;

begin

//Π‘Π±ΠΎΡ€ свСдСний ΠΎΠ± ΠΎΠΊΠ½Π΅

//..имя класса

SetLength(buffer, 1024);

SetLength(buffer, GetClassName(wnd, PAnsiChar(buffer), 1024));

txtClassName.Text := buffer;

//..имя (заголовок) окна

SetLength(buffer, SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0) + 1);

SendMessage(wnd, WM_GETTEXT, Length(buffer),

Integer(PAnsiChar(buffer)));

txtWindowName.Text := buffer;

//..ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (ΠΈΠ»ΠΈ дСскриптор мСню) ΠΎΠΊΠ½Π°

txtId.Text := IntToStr(GetWindowLong(wnd, GWL_ID));

//..ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ

GetWindowRect(wnd, rect);

txtWindowRect.Text :=

\'(\' + IntToStr(rect.Left) + \',\' + IntToStr(rect.Top) + \')\' +

\' β€“ \' +

\'(\' + IntToStr(rect.Right) + \',\' + IntToStr(rect.Bottom) + \') \' +

IntToStr(rect.Right–rect.Left) + \'x\' + IntToStr(rect.Bottom –

rect.Top);

//ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ стиля ΠΎΠΊΠ½Π°

LoadWindowStyle();

LoadWindowExStyle();

end;

Если Π²Ρ‹ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ просмотрСли листинг 10.5, Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π΄Π²ΡƒΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Π² Π΄Π²ΡƒΡ… послСдних строках ΠΊΠΎΠ΄Π°. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° LoadWindowStyle заполняСт списки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈ доступных ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… стилСй (см. рис. 10.4), Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° LoadWindowExStyle соотвСтствСнно заполняСт списки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈ доступных Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… (ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ…) стилСй ΠΎΠΊΠ½Π°.

РСализация ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ LoadWindowStyle приводится Π² листингС 10.6

...

Листинг 10.6.

Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ списков ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… стилСй

procedure TfrmWindowProp.LoadWindowStyle();

var

i: Integer;

style: DWORD;

begin

style := GetWindowLong(wnd, GWL_STYLE);

lstStyle.Clear();

lstAvailStyle.Clear();

//Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· 32-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ значСния ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… стиля ΠΎΠΊΠ½Π°

for i := 0 to 17 do

if styles[i].value and style <> 0 then

begin

//Π‘Ρ‚ΠΈΠ»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ

lstStyle.Items.Add(styles[i].name);

styles[i].used := True;

end

else

begin

//Π‘Ρ‚ΠΈΠ»ΡŒ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ

lstAvailStyle.Items.Add(styles[i].name);

styles[i].used := False;

end;

end;

ВмСсто Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠΌ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GetWindowLong, Π±ΠΈΡ‚ΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ стиля ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, case здСсь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ массив styles структур Styleinf ΠΎ. ОбъявлСниС Ρ‚ΠΈΠΏΠ° структуры (записи) Styleinf ΠΎ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

...

type

StyleInfo = record

value: DWORD; //Код стиля

name: String; //ВСкстовоС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стиля

used: Boolean; //Π‘Π»ΡƒΠΆΠ΅Π±Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅

end;

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива styles Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΎΠΊΠΎΠ½Π½ΠΎΠΌ стилС. ОбъявлСниС этого массива, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ структуры Stylelnfo ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… рассмотрСнных Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, находится Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ WindowData, располоТСнном Π½Π° дискС Π² ΠΏΠ°ΠΏΠΊΠ΅ с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Π³Π»Π°Π²Ρ‹.