Articole - Lecții - iczelion, benzi de circulație
In acest tutorial, vom studia cârlige. Aceasta este o tehnică foarte puternic. Cu ajutorul lor va fi în măsură să intervină în d.pugiye ppotsessy și, uneori, schimba comportamentul.
cârlige pentru Windows poate fi considerat unul dintre cele mai puternice tehnici. Cu ajutorul lor, puteți pepehvatyvat eveniment, care a fost apoi se întâmplă în interiorul unui creat de tine sau cineva d.pugoy procesul. Pepehvatyvaya tot ce soobschayate pentru Windows pe funcția de filtre, de asemenea, numit funcția pepehvata, care a fost apoi să fie numit în fiecare paz, când va ppoishodit eveniment intepesuyuschee. Există două tipuri de cârlige: locale și la distanță.Sistemul pepehvatyvayut toate evenimentele ppednaznachennye pentru toate firele din toate sistemele de ppotsessov.
La instalarea cârlige, amintiți-vă că acestea au un impact negativ asupra sistemului bystpodeystvie. Mai ales în acest sistem diferit. Din moment ce toate evenimentele vor fi scopul ppohod chepez funcția, sistemul poate potepyat semnificativ în bystpodeystvii.
Prin urmare, dacă utilizați cârligul de sistem, ar trebui să le utilizați numai atunci când aveți nevoie de ea deystvitelno. De asemenea, există o mare de probabilități care d.pugiye ppotsessy poate închide dacă ceva neppavilno în funcția. Nu uitați: cu responsabilitatea forței ppihodit.
Ai nevoie pentru a înțelege modul în care cârlige pabotal de a le utiliza în mod eficient. Când sozdadaete cârlig, Windows creează o conexiune de date în memorie o structură care conține informații despre Hook, și o adaugă la o listă legată de cârlige existente. Register nou cârlig se adaugă peped toate cârlige stapyh. Când se întâmplă un eveniment, dacă setați un cârlig locale, numit Filtrele dispun în ppotsesse dvs., astfel încât totul pposto. Dar dacă ați instalat un sistem de xy la distanță ar trebui să inserați codul cârlig procedura fereastra din spațiul de adrese d.pugoy procesului. Sistemul poate face acest lucru doar în cazul în care funcția este într-un DLL. Astfel, CL, dacă doriți să utilizați ~ cârlig de la distanță, cârlig procedura de fereastră trebuie să fie într-un DLL. Regulile acestui există două excepții:
zhupnalno-înregistrare și setarea cârlige zhupnalno-play. Procedura Hook-fereastra pentru aceste tipuri de cârlige trebuie să fie în firul, iar excentricitatea installipoval cârlige. Ppichina acest kpoetsya că Oba afacere cârlig cu nizkoupovnevym pepehvatom hapdvapnyh evenimente de intrare. Aceste evenimente trebuie să fie înregistrate / ppoigpany în ordine în koto.pom ei ppoizoshlo. În cazul în care codul de cârlig este într-un DLL, evenimentele de intrare pot fi „pazbposany“ pe mai multe de fir, ceea ce face imposibil să se stabilească secvența exactă a acestora. Soluție: procedura fereastra cârligele trebuie să fie într-unul din fir, adică, în fir, iar cârligele set excentricitate.
Există 14 tipuri de cârlige:WH_DEBUG - cârlig utilizat pentru depanare cârlig procedura de fereastră.
Tepe.p, atunci când învățăm un pic de teorie, putem pepeyti la modul în care se instalează de fapt / elimina cârlige.
Pentru a instala cârlig, aveți nevoie pentru a apela funcția SetWindowsHookEx cu următoarea sintaxă:
HookType - este una dintre valorile de mai sus pepechislennyh (WH_MOUSE, WH_KEYBOARD etc.).ThreadID - acesta este ID-ul de fir, pe computerul pe care doriți să puneți un cârlig. Parametrul care se determină din această dacă un cârlig este local sau la distanță. Dacă acest Paven Parametrul NULL, Windows va avea un cârlig și un sistem de la distanță, iar excentricitatea zatpagivaet toate firele din sistem. Dacă specificați ID-ul unuia dintre firele din propria ppotsessa, cârligul este locală. Dacă specificați ID-ul firului de la ppotsessa d.pugoy, cârligul va tpedospetsializipovannym și de la distanță. Regulile acestui există două excepții: WH_JOURNALRECORD și WH_JOURNALPLAYBACK - este întotdeauna un sistem de cârlige locale, care apoi nu a fost nevoie să fie în DLL. De asemenea, WH_SYSMSGFILTER - este întotdeauna un cârlig de la distanță sistem. De fapt, acesta este identic cu cârlig WH_MSGFILTER ÎN TIMPUL ThreadID pavnym 0.
Dacă apelul este de succes, se întoarce mânerul cu cârlig în EAX. Dacă nu, returnează NULL. Trebuie să sohpanit mânerul cârlig pentru ao elimina pe viitor.
Puteți deinstallipovat cârlig, provocând UnhookWindowsHookEx, care accepta un singur parametru - mânerul cârlig, excentricitate nevoie deinstallipovat. Dacă apelul reușește, returnează o valoare nenulă în EAX. În caz contrar, se va întoarce NULL.
Procedura Hook-fereastra va fi numit în fiecare paz când va ppoishodit assotstsiipovannoe eveniment cu cârlig installipovannym. De exemplu, dacă cârlig installipuete WH_MOUSE, atunci când evenimentul ppoishodit asociat cu mouse-ul, cârlig va fi cauzate de procedura fereastra. Indiferent de tipul de cârlig, cârlig procedura fereastra va avea întotdeauna același prototip:
nCode specifică codul cârlig.wParam si lParam sodepzhat mai multe sfaturi despre eveniment.
-
WH_CALLWNDPROC
- wParam conține mesajul trimis, în cazul în care nu este Paven zero, punctele lParam la structura în CWPSTRUCT.
- Valoarea de retur: nu este utilizat, returnează un zero.
- nCode poate fi HC_ACTION pavno sau HC_NOREMOVE.
- wParam conține mesajul mouse-ului.
- lParam puncte la structura pentru MOUSEHOOKSTRUCT.
-
Valoarea de retur: zero, dacă mesajul ar trebui să fie obpabotano. 1 în cazul în care ar trebui să fie ppopuscheno mesajul.
Trebuie să Ob ser sppavochniku pe Win32 API pentru detalii descrie valoarea parametrilor și valoarea de returnare a cârligului, iar excentricitatea pe care doriți să instalați.
Tepe.p o altă nuanță în ceea ce privește cârlig procedura fereastra. Amintiți-vă că cârligele sunt conectate într-o listă legată, ppichem la începutul său standuri cârlig set ultima. Atunci când evenimentul ppoishodit, Windows va apela numai cârlig pe.pvyy în lanț. Apelați următorul cârlig în lanțul rămâne responsabilitatea dumneavoastră. Nu se poate numi, dar ar fi bine să știi ce faci. Ca regula, ar trebui să solicite următoarea procedură fereastră pentru a d.pugiye cârlige ar putea, de asemenea, eveniment obpabotat. Puteți apela următorul cârlig prin utilizarea funcțiilor CallNextHookEx:
hHook - mâner pentru cârlig. Funcția utilizează acest cârlig pentru a preciza că ceea ce aveți nevoie pentru a apela următorul cârlig.nCode, wParam si lParam - ai pepedaete parametrii relevanți, obținute decât Windows.
Un detaliu important în ceea ce privește cârligele de la distanță: cârlig procedura de fereastră trebuie să fie într-un DLL, care a fost apoi să fie d.pugoy ppomeppipovana în acest proces. Atunci când un Windows DLL în intruziuni ppotsess porfir meppipuet, secțiunea de date meppipovatsya nu va. Adică, toate ppotsessy pazdelyayut o copie a secțiunii a codului, dar ei vor avea propria copie personală a secțiunii DLL a codului! Acest lucru poate fi un syupppizom mare pentru persoana neppeduppezhdennogo. S-ar putea crede că valorile VARIATIONS sohpanenii într-o variabilă în secțiunea de date a DLL, valoarea este obtinerea tuturor ppotsessy, porni DLL-ul în spațiul său de adrese. Ha fapt, nu este. În condiții normale, acest ppavilno comportament, deoarece creează iluzia că fiecare proces are o copie privată a DLL. Dar nu atunci când vine vorba de agățare pentru Windows. NAMA necesitatea de a DLL a fost identic în toate ppotsesse, inclusiv date. Solutia: trebuie să marcați secțiunea de date ca pazdelyaemuyu. Acest lucru se poate face prin specificarea attpibuty secțiunea linkepu. Dacă PECH MASM'e vorbesc despre, acest lucru se face după cum urmează:
Nume secțiunea initsializipovannyh '.data' date, dar neinițializate -“.bss'. De exemplu, dacă doriți skompilipovat DLL, care a fost apoi conține cârlig procedura de fereastră, și ai nevoie de acea secțiune a pazdelyalas de date între neinițializate ppotsesse, ar trebui să utilizați următoarea comandă:
'S' Attpibut notează că articolul pazdelyaemaya.
Există două module - unul este programul principal cu GUI'em, și alte - este un DLL, care a fost apoi set / elimina cârlig.
Exemplificați dialog otobpazit caseta tpemya controale de editare, care a fost apoi să fie umplut cu numele clasei, mânerul ferestrei și adresa procedurii ferestrei asociată cu fereastra sub cursorul mouse-ului. Există două butoane - Hook și Ieșire. Când apăsați butonul Hook, mesajele mouse-ul programului pepehvatyvaet și textul de pe buton se schimbă la Desprindeți. Când mutați cursorul mouse-ului peste orice fereastră, oferă informații cu privire la programele vor otobpazitsya în fereastra. Când apăsați butonul Desprindeți, programul ubepet montat cârlig.
Programul principal folosește o casetă de dialog ca principal. Acesta este determinat din analiza un mesaj special - WM_MOUSEHOOK, care a fost apoi să fie utilizat între programul principal și DLL cârlig. În cazul în care programul principal primește acest mesaj, wParam conține mânerul ferestrei, care a fost apoi localizat pe cursorul mouse-ului. Desigur, a fost făcut amestecare. Am peshil trimite mânerul în wParam, care a fost pposche. Puteți selecta d.pugoy metodă de comunicare între programul principal și DLL cârlig.
Ppogpammy se bucură de pavilion, HookFlag, pentru a monitoriza starea cârlig Word.
El pavna FALSE, în cazul în care cârligul nu este instalat și TRUE, dacă setul.
Atunci când utilizatorul apasă butonul cârlig, programul verifică dacă cârligul este deja instalat. Dacă este așa, acesta solicită InstallHook funcția de DLL. Rețineți că trece mânerul dialogul principal ca funcția de cârlig pentru a-PARAMETRI DLL pot trimite mesaje WM_MOUSEHOOK fereastra ve.pnites', adică al nostru.
Atunci când programul este încărcat, DLL cu un cârlig și zagpuzhetsya. De fapt, DLL zagpuzhayutsya spazu după ppogpammy este în memorie. Funcția DLL de intrare este numit ppezhde decât ar fi prima instrucțiune se execută programul principal. Prin urmare, atunci când începe programul principal DLLi inițializează. Am pus următorul cod în funcția de introducere cârlig-DLL:
Funcția InstallHook în sine este foarte pposto. Ea sohpanyaet fereastra mâner pepedanny-l ca parametri, în hWnd variabilă la nivel mondial. Apoi solicită SetWindowsHookEx, pentru a seta cârlig pe un mouse. Valoarea Vozvpaschennoe sohpanyaets într-o hHook variabilă la nivel mondial, că, în viitor pepedat UnhookWindowsHookEx.
Odată numit SetWindowsHookEx, cârlig începe să lucreze. Fiecare paz, atunci când sistemul se întâmplă eveniment al mouse-ului este numit MouseProc (cârlig procedura de fereastră).
În primul rând numit CallNextHookEx, pentru a d.pugiye cârlige ar putea, de asemenea, mouse-ul de evenimente obpabotat. După aceea, se numește funcția WindowFromPoint pentru a obține mânerul ferestrei, care se află în coordonatele specificate ale ek.pana. Rețineți că vom folosi POINT struct, este un membru al MOUSEHOOKSTRUCT struct, pe koto.puyu punctele lParam, adică, coordonatele ku.pso.pom locația actuală. După aceea, vom trimite mânerul fereastra de principal mesajului programului chepez WM_MOUSEHOOK. Trebuie să ne amintim că nu trebuie să utilizați SendMessage în cârlig procedura ferestrei, deoarece poate provoca „ingheata“, asa ca pekomenduetsya folosesc PostMessage. MOUSEHOOKSTRUCT structura pentru a defini o mai jos:
pt - este curentul de coordonate al cursorului mouse-ului.Când fereastra principală primește WM_MOUSEHOOK, se folosește mânerul ferestrei în wParam'e pentru a obține informațiile despre fereastra.
Pentru a evita meptsaniya vom verifica pentru a vedea dacă textul este identic în control'ah edita textul, iar excentricitatea am sobipaemsya intra. Dacă este așa, atunci ppopuskaem această etapă.
Obținem numele clasei prin apelarea GetClassName, adresa procedurii ferestrei prin apelarea valorii GetClassLong GCL_WNDPROC, și apoi le fopmatipuem în șir și puneți-l în caz de editare control'y.
Când yuzep apasă butonul Desprindeți, programul va determina funcția UninstallHook în cârlig-DLL. UninstallHook numai cauze UnhookWindowsHookEx. După aceea, se schimbă ob.patno textul buton de pe „Hook“, HookFlag la FALSE și șterge sodepzhimoe controale de editare.
Respectați avertismentul cu privire la opțiunile linkepa în Makefile.
sectiunea .bss este marcat ca pazdelyaemaya la toate secțiunea neinitsializipuemyh de date cu cârlig-DLL ppotsessy pazdelyali. Fără această opțiune, DLL-ul pentru a funktsionipovala neppavilno.