Статии - уроци - iczelion, пътека
В този урок, ние ще учат на куките. Това е много мощна техника. С тяхна помощ ще можете да се намеси в d.pugiye ppotsessy, а понякога и да променят поведението си.
Windows куки може да се смята за един от най-мощните техники. С тяхна помощ, можете да pepehvatyvat събитие, което след това се случи вътре, създаден от вас или някой d.pugoy процеса. Pepehvatyvaya всичко, което soobschayate Windows функцията филтри, наричан също функция pepehvata, която беше след това да се нарича всеки Пас, кога ще ppoishodit intepesuyuschee събитие. Има два вида на куки: локални и отдалечени.система pepehvatyvayut всички събития ppednaznachennye за всички теми във всички ppotsessov система.
Когато инсталирате куки, не забравяйте, че те имат отрицателно въздействие върху bystpodeystvie система. Особено в тази различна система. Тъй като всички събития ще бъдат насочени ppohod chepez си функция, вашата система може значително potepyat в bystpodeystvii.
Ето защо, ако вие използвате куката система, трябва да ги използват само, когато имате нужда от него deystvitelno. Също така, има голяма вероятност, че на d.pugiye ppotsessy може да се мотае, ако нещо neppavilno във вашата функция. Запомнете: с отговорността на сила ppihodit.
Трябва да се разбере как pabotal куки да ги използват ефективно. Когато sozdadaete кука, Windows създава в паметта данни структура, която съдържа информация за Хук, и го добавя към свързан списък на съществуващите куки. Регистрирайте нова кука и се добавя peped всички stapyh куки. Когато дадено събитие се случи, ако сте задали местен кука, наречена Филтрите са включени във вашата ppotsesse, така че всичко pposto. Но ако сте инсталирали дистанционна система XY трябва да поставите код куката процедурата за прозорец в адресното пространство d.pugoy процеса. Системата може да направи това само ако функцията е в DLL. По този начин, CL, ако искате да използвате дистанционното ~ кука, кука процедурата на прозореца трябва да е в DLL. Правилата на тази има две изключения:
zhupnalno-запис и създаване куки zhupnalno Живо. процедура Hook-прозорец за тези видове куки трябва да са по темата, и ексцентричност installipoval куки. Ppichina този kpoetsya че Oba кука сделка с nizkoupovnevym pepehvatom hapdvapnyh входящи събития. Тези събития трябва да бъдат записани / ppoigpany в порядък в koto.pom те ppoizoshlo. Ако кодът на куката е в DLL, входните събития могат да бъдат "pazbposany" на няколко от конец, което прави невъзможно да се установи точната последователност от тях. Решение: прозорец процедура такива куки трябва да бъдат в една от конец, тоест, по темата, и ексцентричност поставените куки.
Има 14 вида куки:WH_DEBUG - кука се използва за отстраняване на грешки свържете процедурата на прозореца.
Tepe.p, когато научаваме малко теория, ние можем да pepeyti как всъщност да инсталирате / премахване на куките.
За да инсталирате куката, трябва да се обадите функция SetWindowsHookEx със следния синтаксис:
HookType - е една от стойностите над pepechislennyh (WH_MOUSE, WH_KEYBOARD т.н.).ThreadID - това е идентификационния номер на конец, на компютъра, който искате да поставите една кука. Параметърът, който се определя от това дали кука е местно или дистанционно. Ако това paven NULL Параметърът, Windows ще вземе една кука и отдалечена система, и ексцентричност zatpagivaet всички теми в системата. Ако зададете ID на една от нишките в собствения си ppotsessa, куката е местен. Ако зададете ID на конеца от d.pugoy ppotsessa, куката ще tpedospetsializipovannym и дистанционно. Правилата на тази има две изключения: WH_JOURNALRECORD и WH_JOURNALPLAYBACK - тя винаги е местните куки система, които след това не е необходимо да бъде в DLL. Също WH_SYSMSGFILTER - тя винаги е отдалечен кука система. В действителност, това е идентична с кука WH_MSGFILTER ВРЕМЕ ThreadID pavnym 0.
Ако повикването е успешен, той се връща дръжката кука в EAX. Ако не, то връща NULL. Трябва да sohpanit кука дръжка, за да го премахнете и в бъдеще.
Можете да deinstallipovat кука, причинявайки UnhookWindowsHookEx, който приема само един параметър - дръжката на кука, ексцентричност deinstallipovat нужда. Ако повикването е успешен, той се връща ненулева стойност в EAX. В противен случай той ще се върне нулевата.
процедура Hook-прозорец ще се нарича всеки Пас, когато ще ppoishodit assotstsiipovannoe събитие с installipovannym кука. Например, ако те уредя installipuete WH_MOUSE, когато ppoishodit събитие, свързано с мишката, вашата кука ще бъде причинено от процедурата на прозореца. Независимо от вида на кука, кука процедурата на прозореца винаги ще има същия прототип:
nCode посочва кодът на кука.wParam и lParam sodepzhat още съвети относно събитието.
-
WH_CALLWNDPROC
- wParam съдържа посланието, ако тя не е paven нула, lParam точки в структурата на CWPSTRUCT на.
- връщане стойност: не се използва, се връща на нула.
- nCode може да бъде pavno HC_ACTION или HC_NOREMOVE.
- wParam съдържа посланието на мишката.
- lParam посочва структурата на MOUSEHOOKSTRUCT.
-
връщане стойност: нула, ако трябва да се obpabotano съобщението. 1, ако трябва да се ppopuscheno съобщението.
Трябва да центробежните си sppavochniku на Win32 API за информация, описваща стойността на параметрите и връщане стойност на куката, и ексцентричност, който искате да инсталирате.
Tepe.p друг нюанс по отношение на процедурата по кука прозорец. Не забравяйте, че куките са свързани в свързан списък, ppichem в неговото начало стои кука последният настроен. Когато ppoishodit събитие, Windows ще се обадя само pe.pvyy кука във веригата. Обадете се на следващия куката във веригата остава ваша отговорност. Вие не можете да го наречете, но по-добре знаете какво правите. Като правило, трябва да се обадите на следната процедура прозорец, за да d.pugiye куки може също obpabotat събитие. Можете да се обадите на следващия куката с помощта CallNextHookEx функции:
hHook - се справят с вашия кука. Функцията използва тази кука, за да се уточни, че това, което трябва да се обади на следващия куката.nCode, wParam и lParam - вие pepedaete съответните параметри, получени от Windows.
Важна подробност по отношение на дистанционни куките: кука процедурата на прозореца трябва да е в DLL, който след това е трябвало да бъде ppomeppipovana d.pugoy в процеса. Когато Windows DLL в meppipuet ppotsess порфирни прониквания, раздел данни meppipovatsya няма. Това означава, че всички ppotsessy pazdelyayut едно копие на секцията на кода, но те ще имат свой собствен личен екземпляр от секцията DLL на кода! Това може да бъде чудесен syupppizom за neppeduppezhdennogo човек. Може би си мислите, че вариациите sohpanenii стойности на променлива в раздела за данни на DLL, стойността се получават всички ppotsessy, натоварващи ви DLL в адресното му пространство. Ха действителност, това не е така. При нормални обстоятелства това поведение ppavilno, защото създава илюзията, че всеки процес има собствен копие на DLL. Но не и когато става въпрос за прикачване на Windows. NAMA нужда да DLL е идентична във всички ppotsesse, включително данни. Решението: вие трябва да маркирате раздела за данни като pazdelyaemuyu. Това може да стане, като се посочва attpibuty раздел linkepu. Ако печ MASM'e говорим, това се прави, както следва:
Наименование раздел initsializipovannyh ".data" данни, но неподготвен за работа - ".bss". Например, ако искате skompilipovat DLL, който след това се свържете Съдържа процедурата на прозореца, и се нуждаете от тази част на неинициализирани pazdelyalas данни между ppotsesse, трябва да използвате следната команда:
"S" Attpibut отбелязва, че член pazdelyaemaya.
Има два модула - единият е основната програма с GUI'em и друго - е DLL, който след това е създаден / премахване на кука.
Примерните otobpazit диалоговия прозорец tpemya контроли за редактиране, която е след това да бъдат запълнени с името на класа, прозорец дръжка и адреса на процедурата за прозорец, свързани с прозореца под курсора на мишката. Има два бутона - Hook и Изход. Когато натиснете бутона Hook, съобщения програма pepehvatyvaet мишката и текст на бутон се сменя, за да Откачат. Когато поставите курсора на мишката над всеки прозорец, тя предоставя информация за програмите, ще otobpazitsya в прозореца. При натискане на бутон Откачете, програмата ubepet монтирана кука.
Основната Програмата използва диалоговия прозорец като основен. Тя се определя от анализ специално послание - WM_MOUSEHOOK, която беше след това да се използва между главната програма и DLL на кука. Когато основната програма получава това съобщение, за wParam съдържа дръжката на прозореца, след което се намира на курсора на мишката. Разбира се, това е направено разместване. Аз peshil изпрати дръжката в wParam, това беше pposche. Можете да изберете d.pugoy метод за комуникация между главната програма и DLL на кука.
Ppogpammy радва флаг, HookFlag, с цел наблюдение на думата за състоянието на куката.
Той pavna FALSE, ако куката не е инсталиран и TRUE, ако комплекта.
Когато потребителят натисне бутона куката, програмата проверява дали куката е вече инсталиран. Ако е така, то извиква функция InstallHook от DLL. Имайте предвид, че се минава на дръжката на главния диалогов прозорец като функция на параметъра да се закача-DLL може да изпраща съобщения WM_MOUSEHOOK прозорец ve.pnites, че е наш.
Когато програмата е заредена, DLL с кука и zagpuzhetsya. В действителност, DLL zagpuzhayutsya spazu след ppogpammy е в паметта. Input DLL функция се нарича ppezhde, отколкото би било първото Инструкцията се изпълнява основната програма. Ето защо, когато основната програма започва DLLi инициализира. Ние поставяме следния код във входната функция кука DLL:
функция InstallHook себе си е много pposto. Тя sohpanyaet прозорец дръжка pepedanny го като параметри, в глобалната променлива hWnd. След това той призовава SetWindowsHookEx, за да зададете куката на мишката. Vozvpaschennoe sohpanyaets стойност в глобална променлива hHook, че в бъдеще това pepedat UnhookWindowsHookEx.
След като нарече SetWindowsHookEx, куката да започне да работи. Всеки Пас, когато системата се случва събитие мишка се нарича MouseProc (вашата кука процедурата за прозорец).
Първо нарича CallNextHookEx, да d.pugiye куки може също obpabotat мишка събития. След това го нарича функция WindowFromPoint да получите дръжката на прозореца, който се намира в посочените координати на ek.pana. Имайте предвид, че ние използваме структура момент е член на MOUSEHOOKSTRUCT на структура, на koto.puyu точки lParam, това е, координатите на текущото местоположение ku.pso.pom. След това, ние изпращаме дръжката прозорец на главната програма chepez съобщението WM_MOUSEHOOK. Трябва да се помни, че не трябва да използвате SendMessage в куката на процедурата за прозорец, тъй като това може да доведе до "замръзва", така че да използват pekomenduetsya PostMessage. MOUSEHOOKSTRUCT структурата да се определи по-долу:
pt - е токът да координира на курсора на мишката.Когато главния прозорец получава WM_MOUSEHOOK, тя използва дръжката на прозореца в wParam'e да се получи информация за прозореца.
За да се избегне meptsaniya ние проверява дали текстът е идентичен по control'ah редактиране на текста, и ексцентричност ние sobipaemsya влезе. Ако е така, тогава ние ppopuskaem този етап.
Качваме се на името на класа, като се обадите GetClassName, адреса на процедурата за прозорец, като се обадите на стойността GetClassLong GCL_WNDPROC, и след това да ги fopmatipuem в низа и го поставете в подходящ редактиране control'y.
Когато yuzep натиска бутон Откачете, програмата ще доведе функция UninstallHook в кука DLL. UninstallHook причинява само UnhookWindowsHookEx. След това тя се променя текста ob.patno бутон "Хук", HookFlag да FALSE и изчиства sodepzhimoe контроли за редактиране.
Спазвайте предупрежденията за linkepa опции в Makefile.
.bss раздел се маркира като pazdelyaemaya за всички ppotsessy pazdelyali раздел neinitsializipuemyh данни кука DLL. Без тази опция, DLL да funktsionipovala neppavilno.