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

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

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

10.1. Π›ΠΎΠ²ΡƒΡˆΠΊΠΈ Windows

Из ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π² Π²Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ понятСн ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, извСстСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Windows для управлСния ΠΎΠΊΠ½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, β€“ сообщСния. ВСроятно, большая ΠΌΠΎΡ‰ΡŒ этого ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΈ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя Π΅Π³ΠΎ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ состоят Π² возмоТности посылки сообщСний Π»ΡŽΠ±Ρ‹ΠΌ ΠΎΠΊΠ½Π°ΠΌ (ΠΎΠΊΠ½Π°ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса ΠΈΠ»ΠΈ ΠΎΠΊΠ½Π°ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссов).

Π’ Windows Ρ‚Π°ΠΊΠΆΠ΅ прСдусмотрСн ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ событиями Π² систСмС ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ сообщСний, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ. Π Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎΠ± установкС Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ. Π›ΠΎΠ²ΡƒΡˆΠΊΠ° прСдставляСт собой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ события, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠΊΠ½ΠΎΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши, записи события Π² систСмный ΠΆΡƒΡ€Π½Π°Π» ΠΈ Ρ‚. Π΄.: всС зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, для ΠΊΠ°ΠΊΠΈΡ… событий Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ прСдусмотрСли Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ΅Π½ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π² Windows прСдусмотрСны Π΄Π°ΠΆΠ΅ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ.

ΠœΡ‹ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простыС Π²ΠΈΠ΄Ρ‹ Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ, ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… сообщСния ΠΎΠΊΠΎΠ½. По Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ дСйствия рассмотрСнныС Π½Π°ΠΌΠΈ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ устанавливаСмыми Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ: ΠΏΡ€ΠΈ ошибкС Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠ΅ это бСзопаснСС для систСмы.

НачинаСтся созданиС Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ с написания собствСнно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

...

function HookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT stdcall;

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ code ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обозначСния Ρ‚Π΅Ρ… случаСв, ΠΊΠΎΠ³Π΄Π° функция Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CallNextHookEx ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Сю. НазначСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² wParamΠΈ lParam этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сильно зависят ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, для Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ событиС Π»ΠΎΠ²ΡƒΡˆΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

Для рСгистрации Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ API-функция SetWindowsHookEx, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

...

function SetWindowsHookEx(idHook: Integer; //Π’ΠΈΠΏ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ

lpfn: TFNHookProc; //АдрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ

hmod: HINST; //Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ

//располоТСна функция Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ

dwThreadId: DWORD //Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°, для

//ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ создаСтся Π»ΠΎΠ²ΡƒΡˆΠΊΠ°

): HHOOK; stdcall;

Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ создания Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ функция SetWindowsHookEx Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор Π½ΠΎΠ²ΠΎΠΉ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ (Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅).

Для удалСния Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция UnhookWindowsHookEx, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ СдинствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ – дСскриптор Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SetWindowsHookEx. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, поэтому ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ прилоТСния Π½Π΅ слСдуСт Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ UnhookWindowsHookEx.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ нСсколько слов ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CallNextHookEx. Π•Π΅ объявлСниС ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

...

function CallNextHookEx(hhk: HHOOK; nCode: Integer;

wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

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

Π’ΠΈΠ΄Ρ‹ Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ список Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… простых Ρ‚ΠΈΠΏΠΎΠ² Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ констант ΠΈΠ· модуля Windows, ΠΈΡ… ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΡ… ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetWindowsHookEx:

β€’ WH_CALLWNDPROC – функция Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ вызываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний ΠΎΠΊΠΎΠ½, созданных Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ;

β€’ WH_CALLWNDPROCRET – вызываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний ΠΎΠΊΠΎΠ½ наблюдаСмого ΠΏΠΎΡ‚ΠΎΠΊΠ°;

β€’ WH_KEYBOARD – функция Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ вызываСтся ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ сообщСний WM_KEYDOWN ΠΈ WM_KEYUP ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ исслСдуСмого ΠΏΠΎΡ‚ΠΎΠΊΠ°;

β€’ WH_MOUSE – вызываСтся ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ наблюдаСмого ΠΏΠΎΡ‚ΠΎΠΊΠ° сообщСний ΠΎΡ‚ манипулятора Β«ΠΌΡ‹ΡˆΡŒΒ».

Рассмотрим, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ 1 Par am ΠΈ wParam Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· пСрСчислСнных случаСв.

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π˜Ρ‚Π°ΠΊ, для Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ WH_CALLWNDPROC, которая, кстати, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² рассматриваСмом Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π΄Π²Π° послСдних ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€’ wParam – Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ссли сообщСниС послано Π² ΠΎΠΊΠ½ΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ исполняСтся функция Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ, ΠΈ Π½Π΅ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ссли сообщСниС послано Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ;

β€’ lParam – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру TCWPStruct, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сообщСнии, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ ΠΎΠΊΠ½Ρƒ (ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ).

ОбъявлСниС структуры TCWPStruct с описаниСм Π΅Π΅ ΠΏΠΎΠ»Π΅ΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

...

type TCWPStruct = packed record

lParam: LPARAM; //ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сообщСния

wParam: WPARAM; //ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сообщСния

message: UINT; //Код сообщСния

hwnd: HWND; //Окно, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ адрСсовано сообщСниС

end;

НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прСобразования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° lParam Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π° структуру с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΊΠΎΠ΄Π° сообщСния (Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹):

...

var hook_data : hook_data: ^TCWPStruct;

begin

hook_data := Pointer(lParam);

if hook_data^.message = WM_SIZE then

begin

//Π Π΅Π°Π³ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠ½Π°

end;

end;

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΌ Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, нСслоТноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ), осущСствляСтся Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, поэтому Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹

Для Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ WH_CALLWNDPROCRET ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ wParam ΠΈ lParam Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ слСдуСт Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€’ wParam – Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ссли сообщСниС послано Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом, ΠΈ Π½Π΅ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС;

β€’ lParam – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру TCWPRetStruct, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сообщСнии, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ ΠΎΠΊΠ½Ρƒ (ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ).

ОбъявлСниС структуры TCWPRetStruct с описаниСм Π΅Π΅ ΠΏΠΎΠ»Π΅ΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

...

type TCWPRetStruct = packed record

lResult: LRESULT; //Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ

lParam: LPARAM; //ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сообщСния

wParam: WPARAM; //ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сообщСния

message: UINT; //Код сообщСния

hwnd: HWND; //ДСскриптор ΠΎΠΊΠ½Π°-получатСля

end;

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ сообщСний ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°

Для Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ WH_KEYBOARD ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ wParam ΠΈ lParam Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ слСдуСт Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€’ wParam – ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши;

β€’ lParam – ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 16 Π±ΠΈΡ‚ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ количСство ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ наТатия; ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ 16 Π±ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ описания состояния ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ наТатия клавиши.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ wParam ΠΈ lParam ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ сообщСний WM_KEYDOWN И WM_KEYUP.

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ сообщСний ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ

Π’ Π»ΠΎΠ²ΡƒΡˆΠΊΡƒ WH_KEYBOARD Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… wParam ΠΈ lParam ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

β€’ wParam – ΠΊΠΎΠ΄ сообщСния ΠΌΡ‹ΡˆΠΈ;

β€’ lParam– ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру TMouseHookStruct.

ОбъявлСниС структуры TMouseHookStruct с описаниСм ΠΏΠΎΠ»Π΅ΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

...

type TMouseHookStruct = packed record

pt: TPoint; //Π­ΠΊΡ€Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ указатСля ΠΌΡ‹ΡˆΠΈ

hwnd: HWND; //ДСскриптор ΠΎΠΊΠ½Π°-получатСля сообщСния

wHitTestCode: UINT; //Код, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ

//Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° сообщСниС WM_NCHITTEST

dwExtraInfo: DWORD; //Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

end;

Если Π²Ρ‹ Π·Π°Π±Ρ‹Π»ΠΈ, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ для ΠΎΠΊΠ½Π° coo6nreHHeWM_NCHITTEST, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ вновь ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π³Π». 1.

РасполоТСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΈ DLL

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ располоТСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ.

Казалось Π±Ρ‹, Ρ‡Ρ‚ΠΎ здСсь ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ: написал Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅, строго ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡƒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π» Π΅Π΅ адрСс Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetWindowsHookEx ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Π»ΠΎΠ²ΡƒΡˆΠΊΡƒ. Но Π½Π΅ Ρ‚Π°ΠΊ всС просто. Ѐункция Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли прСдполагаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° сообщСний ΠΏΠΎΡ‚ΠΎΠΊΠ° (ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²) Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ процСсса. Π’ΠΎΠ³Π΄Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ создания Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° hmod слСдуСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Если ΠΆΠ΅ прСдполагаСтся слСТСниС Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ прилоТСниями (Π·Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссов), Ρ‚ΠΎ функция Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ экспортируСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ DLL. Π’ΠΎΠ³Π΄Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetWindowsHookEx пСрСдаСтся дСскриптор модуля DLL (ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ это адрСс Π² адрСсном пространствС процСсса, ΠΊΡƒΠ΄Π° спроСцирован Ρ„Π°ΠΉΠ» DLL). Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (DLL) ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ запускС прилоТСния (Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ load-time связываниС), Ρ‚Π°ΠΊ ΠΈ динамичСски ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LoadLibrary:

...

function LoadLibrary(lpLibFileName: PChar): HMODULE; stdcall;

Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡƒΡ‚ΡŒ DLL ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ модуля (ΠΈΠ»ΠΈ 0 Π² случаС ошибки). Если Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° большС Π½Π΅ Π½ΡƒΠΆΠ½Π°, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ FreeLibrary, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π² качСствС СдинствСнного ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π²ΠΎΠ·Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ LoadLibrary дСскриптор модуля DLL

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

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

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

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