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

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

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

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

end;

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

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ объявлСниС массива styles (Ρ„Π»Π°Π³ΠΈ стиля, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π»Π°Π³ΠΎΠ², Π² массив Π½Π΅ ΠΏΠΎΠΏΠ°Π»ΠΈ) (листинг 10.7).

...

Листинг 10.7.

Массив с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ± ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… стилях

styles: array [0..17] of StyleInfo =

(

(value: WS_BORDER; name: \'WS_BORDER\'),

(value: WS_CAPTION; name: \'WS_CAPTION\'),

(value: WS_CHILD; name: \'WS_CHILD\'),

(value: WS_CLIPCHILDREN; name: \'WS_CLIPCHILDREN\'),

(value: WS_DISABLED; name: \'WS_DISABLED\'),

(value: WS_DLGFRAME; name: \'WS_DLGFRAME\'),

(value: WS_HSCROLL; name: \'WS_HSCROLL\'),

(value: WS_MAXIMIZE; name: \'WS_MAXIMIZE\'),

(value: WS_MAXIMIZEBOX; name: \'WS_MAXIMIZEBOX\'),

(value: WS_MINIMIZE; name: \'WS_MINIMIZE\'),

(value: WS_MINIMIZEBOX; name: \'WS_MINIMIZEBOX\'),

(value: WS_OVERLAPPED; name: \'WS_OVERLAPPED\'),

(value: WS_POPUP; name: \'WS_POPUP\'),

(value: WS_SYSMENU; name: \'WS_SYSMENU\'),

(value: WS_TABSTOP; name: \'WS_TABSTOP\'),

(value: WS_THICKFRAME; name: \'WS_THICKFRAME\'),

(value: WS_VISIBLE; name: \'WS_VISIBLE\'),

(value: WS_VSCROLL; name: \'WS_VSCROLL\')

);

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° LoadWindowExStyle Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° практичСски Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° LoadWindowStyle. Волько ΠΎΠ½Π° заполняСт cnncKHlstExStyle HlstAvailExStyle ΠΈ обращаСтся ΠΊ массиву exstyles, Π° Π½Π΅ styles. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ объявлСниС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ массива exstyles (листинг 10.8).

...

Листинг 10.8.

Массив с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… стилях

exstyles: array [0..18] of StyleInfo =

(

(value: WS_EX_ACCEPTFILES; name: \'WS_EX_ACCEPTFILES\'),

(value: WS_EX_APPWINDOW; name: \'WS_EX_APPWINDOW\'),

(value: WS_EX_CLIENTEDGE; name: \'WS_EX_CLIENTEDGE\'),

(value: WS_EX_CONTEXTHELP; name: \'WS_EX_CONTEXTHELP\'),

(value: WS_EX_CONTROLPARENT; name: \'WS_EX_CONTROLPARENT\'),

(value: WS_EX_DLGMODALFRAME; name: \'WS_EX_DLGMODALFRAME\'),

(value: WS_EX_LAYERED; name: \'WS_EX_LAYERED\'),

(value: WS_EX_LEFT; name: \'WS_EX_LEFT\'),

(value: WS_EX_LEFTSCROLLBAR; name: \'WS_EX_LEFTSCROLLBAR\'),

(value: WS_EX_MDICHILD; name: \'WS_EX_MDICHILD\'),

(value: WS_EX_NOACTIVATE; name: \'WS_EX_NOACTIVATE\'),

(value: WS_EX_NOINHERITLAYOUT; name: \'WS_EX_NOINHERITLAYOUT\'),

(value: WS_EX_NOPARENTNOTIFY; name: \'WS_EX_NOPARENTNOTIFY\'),

(value: WS_EX_RIGHTSCROLLBAR; name: \'WS_EX_RIGHTSCROLLBAR\'),

(value: WS_EX_STATICEDGE; name: \'WS_EX_STATICEDGE\'),

(value: WS_EX_TOOLWINDOW; name: \'WS_EX_TOOLWINDOW\'),

(value: WS_EX_TOPMOST; name: \'WS_EX_TOPMOST\'),

(value: WS_EX_TRANSPARENT; name: \'WS_EX_TRANSPARENT\'),

(value: WS_EX_WINDOWEDGE; name: \'WS_EX_WINDOWEDGE\')

);

ИзмСнСниС ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… стилСй

ИзмСнСниС стилСй ΠΎΠΊΠ½Π° Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ» производится Π½Π΅ слоТнСС, Ρ‡Π΅ΠΌ ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ GetWindowLong ΠΈ SetWindowsLong. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ добавлСния Ρ„Π»Π°Π³Π°, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ Π² спискС доступных стилСй, приводится Π² листингС 10.9.

...

Листинг 10.9.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ стиля

procedure TfrmWindowProp.cmbAddStyleClick(Sender: TObject);

var

style: DWORD;

addstyle: DWORD;

begin

if lstAvailStyle.ItemIndex = –1 then Exit;

//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ стиля ΠΎΠΊΠ½Π°

//..опрСдСляСм, ΠΊΠ°ΠΊΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ

addstyle := styles[GetStyleIndex(lstAvailStyle.ItemIndex,

False)].value;

//..вычисляСм ΠΈ устанавливаСм Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стиля ΠΎΠΊΠ½Π°

style := GetWindowLong(wnd, GWL_STYLE);

style := style or addstyle;

SetWindowLong(wnd, GWL_STYLE, style);

//..пСрСрисуСм всС ΠΎΠΊΠ½Π°

InvalidateRect(0, nil, True);

//Обновим список стилСй ΠΎΠΊΠ½Π°

LoadWindowStyle();

end;

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° стиля производится Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ добавлСнию, просто Π½Π°Π΄ Π±ΠΈΡ‚Π°ΠΌΠΈ стиля ΠΎΠΊΠ½Π° выполняСтся другая опСрация (листинг 10.10).

...

Листинг 10.10.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ стиля

procedure TfrmWindowProp.cmbDelStyleClick(Sender: TObject);

var

style: DWORD;

delstyle: DWORD;

begin

if lstStyle.ItemIndex = –1 then Exit;

//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ стиля ΠΎΠΊΠ½Π°

//..опрСдСляСм, ΠΊΠ°ΠΊΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ

delstyle := styles[GetStyleIndex(lstStyle.ItemIndex, True)].value;

//..вычисляСм ΠΈ устанавливаСм Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стиля ΠΎΠΊΠ½Π°

style := GetWindowLong(wnd, GWL_STYLE);

style := style and not delstyle;

SetWindowLong(wnd, GWL_STYLE, style);

//..пСрСрисуСм всС ΠΎΠΊΠ½Π°

InvalidateRect(0, nil, True);

//Обновим список стилСй ΠΎΠΊΠ½Π°

LoadWindowStyle();

end;

ПослС удалСния ΠΈΠ»ΠΈ добавлСния ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ стиля вызываСтся пСрСрисовка всСх ΠΎΠΊΠΎΠ½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ проявился Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… (Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ…) ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… стилСй осущСствляСтся Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ. Волько ΠΏΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ массив exstyles, функция GetExStylelndex ΠΈ константа GWL_EXSTYLE, пСрСдаваСмая Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetWindowLongΠΈ SetWindowLong.

Π§Ρ‚ΠΎ ΠΆΠ΅ Π·Π° функция GetStylelndex ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² листингС 10.10? Она позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² массивС styles стиля, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π² спискС доступных ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… стилСй (Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ список) (листинг 10.11).

...

Листинг 10.11.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ полоТСния записи ΠΎ Π½ΡƒΠΆΠ½ΠΎΠΌ стилС

function TfrmWindowProp.GetStyleIndex(listIndex: Integer;

used: Boolean): Integer;

var

i, count: Integer;

begin

count := 0;

for i := 0 to 17 do

if styles[i].used = used then

begin

if count = listIndex then

begin

//Нашли

GetStyleIndex := i;

Exit;

end;

Inc(count);

end;

GetStyleIndex := 0;

end;

Ѐункция GetStylelndex ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½ΠΎΠΌΠ΅Ρ€ строки Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ спискС ΠΈ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΡ‚ истинности ΠΈΠ»ΠΈ лоТности ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависит, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ»ΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ стили Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetStylelndex ΠΈ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² структуру Styleinf ΠΎ поля used нСсколько услоТняСт Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивом стилСй, Π½ΠΎ Π·Π°Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ постоянного пСрСмСщСния Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ· массива доступных стилСй Π² массив ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… стилСй. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ Π΄Π²Π° массива для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… стилСй.

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ сообщСний

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΡΠ°ΠΌΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΡƒΡŽ Π·Π° ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ сообщСний Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Π€ΠΎΡ€ΠΌΠ°, вСдущая статистику ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… сообщСний, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½Π° рис. 10.5.

Показанная Π½Π° рис. 10.5 Ρ„ΠΎΡ€ΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ имя frmMessages.

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊ сообщСний состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй: части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π•Π₯Π•), ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅ΠΉ Π·Π° построСниС Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° сообщСний, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ сообщСния, ΠΈ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π² DLL(hook\hook.dll).

ВзаимодСйствиС Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΈ Π•Π₯Π•-Ρ„Π°ΠΉΠ»Π° построСно ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ схСмС.

1. Π˜Π· прилоТСния Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создания ΠΈ удалСния Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ (располоТСнныС Π² DLL).

2. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния функция-Π»ΠΎΠ²ΡƒΡˆΠΊΠ° посылаСт ΠΎΠΊΠ½Ρƒ (Ρ„ΠΎΡ€ΠΌΠ΅) frmMessages сообщСниС WM_SPY_NOTIFY (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Ρ‚ΠΎΡ‡Π½Π΅Π΅, программистом сообщСниС, листинг 10.12).

Рис. 10.5. Π€ΠΎΡ€ΠΌΠ° ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° сообщСний

Но вСдь Π»ΠΎΠ²ΡƒΡˆΠΊΠ° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ процСссС, Π° Ссли Ρ‚Π°ΠΊ, Ρ‚ΠΎ ΠΊΠ°ΠΊ Π΅ΠΉ Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠΊΠ½Ρƒ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сообщСния? Для этого ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имСнованная проСкция Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° Π»ΠΎΠ²ΡƒΡˆΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ сохраняСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠΌ сообщСнии (ΠΊΠΎΠ΄ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ сообщСния). Π­Ρ‚Π° информация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌ слСТСниС. Π”Π°Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° хранятся Π² Π²ΠΈΠ΄Π΅ записи THooklnfo, объявлСнной Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ HookData. Π’ этом ΠΆΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ константа с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΠ΄ сообщСния WM_SPY_NOTIFY (листинг 10.12) ΠΈ Π΄Π²Π΅ слуТСбныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, использованиС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ пояснСно Π΄Π°Π»Π΅Π΅.

...

Листинг 10.12.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° HookData.pas

type

//Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° (запись), которая хранится Π² раздСляСмом Ρ„Π°ΠΉΠ»Π΅

//ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами

THookInfo = record

wnd: HWND; //Окно, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ вСдСтся наблюдСниС

hook_handle: HHOOK; //ДСскриптор Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ

spy_wnd: HWND; //Окно, увСдомляСмоС ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ сообщСния

//Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ поля Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ сообщСния

mess: UINT;

wParam: WPARAM;

lParam: LPARAM;

end;

var

//Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти

hook_info: ^THookInfo;

//ДСскриптор ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ

hFile: THandle;

const

//Имя ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°

strFileMapName = \'TricksDelphi_WinSpy_Mapping\

//Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ для увСдомлСния ΠΎΠΊΠ½Π°-шпиона

WM_SPY_NOTIFY = WM_USER + 1;

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… сообщСний

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вСрнСмся ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ-ΡˆΠΏΠΈΠΎΠ½Ρƒ, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, ΠΊ Ρ‚ΠΎΠΉ Π΅Π³ΠΎ части, которая ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π½Π° рис. 10.5.

НачнСм с самого простого – управлСния Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ сообщСний. Он построСн ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ списками ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… стилСй (Ρ„ΠΎΡ€ΠΌΠ° свойств ΠΎΠΊΠ½Π°, рассмотрСнная Ρ€Π°Π½Π΅Π΅).

Π˜Ρ‚Π°ΠΊ, структура, хранящая ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сообщСнии, выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

...

type MessageInfo = record

value: DWORD; //Код сообщСния

name: String; //НазваниС сообщСния

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

end;

ΠŸΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ стояла Ρ†Π΅Π»ΡŒ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ сообщСния, поэтому массив messageslist (листинг 10.13) содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 16 элСмСнтов. ΠŸΡ€ΠΈ нСобходимости Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ сообщСния ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, взяв ΠΈΡ… обозначСния ΠΈΠ· модуля Windows.

...

Листинг 10.13.

БообщСния, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ

const

mess_first = 0;

mess_last = 15;

var

messages_list: array [mess_first..mess_last] of MessageInfo =

(

(value: WM_DESTROY; name: \'WM_DESTROY\ used: False),

(value: WM_MOVE; name: \'WM_MOVE\ used: False),

(value: WM_SIZE; name: \'WM_SIZE\ used: False),

(value: WM_ACTIVATE; name: \'WM_ACTIVATE\ used: False),

(value: WM_SETFOCUS; name: \'WM_SETFOCUS\ used: False),

(value: WM_KILLFOCUS; name: \'WM_KILLFOCUS\ used: False),

(value: WM_ENABLE; name: \'WM_ENABLE\ used: False),

(value: WM_SETTEXT; name: \'WM_SETTEXT\ used: False),

(value: WM_GETTEXT; name: \'WM_GETTEXT\ used: False),

(value: WM_PAINT; name: \'WM_PAINT\ used: False),

(value: WM_CLOSE; name: \'WM_CLOSE\ used: False),

(value: WM_QUIT; name: \'WM_QUIT\ used: False),

(value: WM_SIZING; name: \'WM_SIZING\ used: False),

(value: WM_MOVING; name: \'WM_MOVING\ used: False),

(value: WM_NOTIFY; name: \'WM_NOTIFY\ used: False),

(value: WM_NCHITTEST; name: \'WM_NCHITTEST\ used: False)

);

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° (Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… сообщСний Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ списки) производится ΠΎΡ‡Π΅Π½ΡŒ просто (листинг 10.14).