Tài liệu Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows: ... Ebook Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows
98 trang |
Chia sẻ: huyen82 | Lượt xem: 1368 | Lượt tải: 0
Tóm tắt tài liệu Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
MUÏC LUÏC
LÔØI MÔÛ ÑAÀU 3
CHÖÔNG 1: TÌM HIEÅU VEÀ LAÄP TRÌNH WINDOWS 4
I. Khaùi quaùt veà laäp trình trong Windows 5
II. Thoâng ñieäp vaø xöû lyù thoâng ñieäp 7
III. Giao dieän thieát bò ñoà hoïa GDI 11
IV. Cöûa soå trong Windows 15
V. Chöông trình Windows tieáp nhaän thoâng ñieäp chuoät 22
CHÖÔNG 2: TÌM HIEÅU VEÀ HOOK 26
1 - Chuoãi hook 27
2 - Thuû tuïc hook 27
3 - Caùc loaïi hook 28
4 - Söû duïng hook 30
5 - Hook trong Windows 3.x 31
6 - Giôùi thieäu moät soá haøm lieân quan ñeán hook 33
CHÖÔNG 3: KYÕ THUAÄT OVERRIDE HAØM API 36
I. Khaùi quaùt veà kyõ thuaät override 37
II. Lyù do söû duïng kyõ thuaät override trong laäp trình Windows 37
III. Cô cheá hoaït ñoäng vaø quaûn lyù boä nhôù treân Windows 16bits 38
IV. Cô cheá hoaït ñoäng vaø quaûn lyù boä nhôù treân Windows 32bits 41
V. Hieän thöïc kyõ thuaät override treân Windows 16bits 45
VI. Moät soá haøm ñöôïc söû duïng trong kyõ thuaät override 50
CHÖÔNG 4: KEÁT XUAÁT VAÊN BAÛN TRONG WINDOWS 54
I. Keát xuaát vaên baûn trong Windows 55
II. Caùc haøm caên baûn ñeå keát xuaát vaên baûn 55
CHÖÔNG 5: PHAÂN TÍCH VAØ THIEÁT KEÁ CHÖÔNG TRÌNH 66
I. Phaân tích vaán ñeà 67
II. Thieát keá chöông trình 68
III. Giôùi thieäu moät soá haøm coù lieân quan 78
IV. Giôùi thieäu moät soá caáu truùc döõ lieäu coù lieân quan 92
KEÁT QUAÛ VAØ HÖÔÙNG PHAÙT TRIEÅN 97
Ñeà taøi : Nghieân cöùu caùc phöông phaùp nhaän daïng töø döôùi cursor mouse treân Desktop Windows.
Vieát chöông trình nhaän daïng töø naøy.
Lôøi Môû Ñaàu
gaøy nay, haàu nhö moïi coâng vieäc haøng ngaøy lieân quan ñeán cuoäc soáng cuûa chuùng ta ñeàu dieãn ra treân maùy tính. Töø vieäc soaïn thaûo vaên baûn, gôûi nhaän thoâng tin ñeán vieäc tra cöùu, truy caäp thoâng tin töø heä thoáng maïng maùy tính toaøn caàu Internet ñoái vôùi ngöôøi söû duïng laø coâng vieäc thöôøng ngaøy vaø raát phoå bieán.
Töø ñoù, seõ phaùt sinh vaán ñeà laø ngöôøi söû duïng seõ caàn tìm hieåu yù nghóa cuûa moät töø, moät caâu hoaëc caàn phaûi dòch moät ñoaïn vaên baûn, moät file döõ lieäu naøo ñoù ra tieáng Vieät vaø ngöôïc laïi. Ñaây laø moät nhu caàu caàn thieát vaø haàu nhö xaûy ra thöôøng xuyeân ñoái vôùi nhieàu ngöôøi, do ñoù nhaän daïng töø ñaëc bieät laø nhaän daïng töø treân maøn hình trong moâi tröôøng Windows laø vieäc laøm caàn thieát vaø coù yù nghóa thöïc teá.
Keát quaû cuûa vieäc nhaän daïng töø seõ ñöôïc duøng ñeå xaây döïng neân caùc öùng duïng khaùc chaúng haïn nhö caùc töø ñieån ñöôïc tra cöùu theo kieåu töông taùc tröïc tieáp seõ raát thuaän tieän cho ngöôøi söû duïng bôûi vì theo caùch naøy thì cho duø ñang ôû trong baát kyø öùng duïng naøo khi caàn tra cöùu thì thao taùc tröïc tieáp ngay treân öùng duïng ñang duøng töùc laø chæ caàn click chuoät vaøo ñoù chöù khoâng caàn phaûi môû töø ñieån roài tra cöùu töø ñoù theo kieåu coå ñieån.
Vì theá, trong thôøi gian laøm Luaän AÙn Toát nghieäp ñöôïc söï höôùng daãn cuûa thaày Leâ Taán Huøng nhoùm sinh vieân chuùng toâi thöïc hieän ñeà taøi: “ Nhaän daïng töø döôùi cursor mouse treân deskop Windows. Vieát chöông trình nhaän daïng töø naøy ”. Trong giai ñoaïn ñaàu cuûa Luaän AÙn Toát Nghieäp chuùng toâi ñaõ nghieân cöùu ñöôïc moät soá vaán ñeà quan troïng vaø caên baûn coù yù nghóa trong vieäc thöïc hieän yeâu caàu ñaõ ñaët ra cuûa ñeà taøi. Ñeà taøi naøy chæ taäp trung nhaän daïng töø ôû daïng text treân desktop cuûa moâi tröôøng Windows roài xuaát keát quaû ra.
Trong thôøi gian laøm Luaän AÙn Toát Nghieäp nhoùm sinh vieân chuùng toâi ñaõ tieán haønh nghieân cöùu cô cheá hoaït ñoäng vaø quaûn lyù cuûa heä ñieàu haønh Windows. Nghieân cöùu veà phöông thöùc laäp trình trong moâi tröôøng Windows vaø caùc phöông tieän maø Windows hoã trôï khi laäp trình. Tham khaûo vaø nghieân cöùu kyõ thuaät override caùc haøm giao tieáp cuûa Windows ôû cheá ñoä 16 bit vaø 32 bit. Nghieân cöùu caùch xöû lyù caùc thoâng ñieäp trong Windows vaø tìm hieåu veà caùch keát xuaát vaên baûn, veà cheá ñoä aùnh xaï, vaán ñeà toïa ñoä . . . vaø caùch xöû lyù vaên baûn. Treân cô sôû ñoù böôùc ñaàu chuùng toâi ñaõ xaây döïng xong moät öùng duïng coù khaû naêng nhaän daïng ñöôïc töø treân neàn Windows 16 bit ñöôïc vieát baèng ngoân ngöõ Visual C++ version 1.5 vaø höôùng phaùt trieån trong thôøi gian tôùi laø hieän thöïc noù treân neàn Win32.
Baùo caùo cuûa chuùng toâi seõ laàn löôït ñieåm qua nhöõng noäi dung maø chuùng toâi ñaõ nghieân cöùu vaø tìm hieåu ñöôïc trong thôøi gian qua. Sau ñoù laø phaàn giôùi thieäu chi tieát veà chöông trình töø khaâu phaân tích-thieát keá cho ñeán phaàn chöông trình nguoàn vaø cuoái cuøng seõ laø neâu nhöõng vaán ñeà coøn toàn taïi vaø höôùng phaùt trieån trong töông lai.
Chöông 1:
TÌM HIEÅU VEÀLAÄP TRÌNH WINDOWS
I - KHAÙI QUAÙT VEÀ LAÄP TRÌNH TRONG WINDOWS:
1 - Khaùi quaùt veà laäp trình trong Windows:
Moâi tröôøng laäp trình Windows veà cô baûn laø döïa treân boä haøm API (Application Programmer Interface), noù coù chöùc naêng nhö caùc ngaét trong baûng vector ngaét cuûa DOS, nhöng noù thaân thieän hôn ôû choã caùch goïi haøm API gioáng heät caùch goïi haøm cuûa ngoân ngöõ caáp cao, moãi haøm coù moät teân goïi haún hoi, vaø teân goïi thöôøng ñöôïc ñaët raát phuø hôïp vôùi coâng duïng cuûa haøm (maëc duø coù hôi daøi doøng) töø ñoù taïo khaû naêng gôïi nhôù cao. Vôùi Windows, ngöôøi laäp trình khoâng coøn phaûi laäp trình theo kieåu assembly nöõa maø laäp trình theo kieåu ngoân ngöõ caáp cao, moïi hoaït ñoäng trong maùy ôû möùc thaáp töø haøm API trôû xuoáng thuoäc phaïm vi cuûa Windows, vaø Windows khoâng khuyeán khích vieäc caùc öùng duïng can thieäp vaøo lónh vöïc naøy. Buø laïi, baèng caùc haøm API, noù hoã trôï raát hieäu quaû cho ngöôøi laäp trình, giuùp khai thaùc khaû naêng cuûa thieát bò trieät ñeå, deã daøng vaø tieän lôïi hôn bao giôø heát. Coù theå noùi Windows ñaõ môû ra cho ngöôøi laäp trình khoâng gian roäng lôùn ñeå phaùt trieån öùng duïng, vaø haïn cheá khoâng gian phaùt trieån heä thoáng. Ñieàu naøy daãn ñeán heä quaû laø caùc öùng duïng ñöôïc taïo ra heát söùc deã daøng, vaø quan troïng laø heä thoáng chaïy oån ñònh hôn, khoâng bò treo do loãi cuûa öùng duïng, khoâng theå xaâm nhaäp, nhöng seõ raát khoù khaên neáu ngöôøi laäp trình muoán tröïc tieáp ñieàu khieån hoaït ñoäng trong maùy vaø phaùt trieån veà laäp trình heä thoáng.
- Tìm hieåu haøm Windows API: Windows laø moät heä ñieàu haønh ña nhieäm (multitasking) maø qua ñoù caùc öùng duïng ôû trong moâi tröôøng Windows seõ giao tieáp vôùi user thoâng qua moät hay nhieàu giao dieän. Ñeå truy caäp caùc giao dieän naøy thì caùc öùng duïng ñöôïc xaây döïng treân moâi tröôøng Windows seõ söû duïng taäp caùc haøm ñöôïc goïi laø giao dieän chöông trình öùng duïng API (Application Program Interface). Chöông trình cuûa ngöôøi söû duïng coù theå goïi tôùi caùc haøm API ñeå truy caäp tôùi moïi taøi nguyeân cuûa Windows. GDI laø moät boä phaän cuûa API, giao dieän thieát bò ñoà hoïa GDI (Graphic Device Interface) coù nhieäm vuï duy trì söï ñoäc laäp cuûa Windows ñoái vôùi caùc thieát bò ñoà hoïa hay coøn goïi laø khaû naêng ñoäc laäp thieát bò (device independent) töùc laø cho pheùp Windows laøm vieäc vôùi nhieàu kieåu thieát bò ñoà hoïa khaùc nhau.
2 - Thö vieän lieân keát ñoäng DLL (Dynamic Link Library):
Thö vieän lieân keát ñoäng laø caùc taäp tin ñöôïc Windows löu döôùi daïng nhò phaân chöùa caùc haøm maø moïi öùng duïng treân Windows ñeàu coù theå söû duïng. Neùt ñaëc tröng cuûa DLL laø noù coù theå ñöôïc söû duïng bôûi nhieàu öùng duïng taïi cuøng moät thôøi ñieåm hay noùi caùch khaùc thö vieän lieân keát ñoäng coù theå cuøng moät luùc ñöôïc goïi bôûi nhieàu chöông trình. DLL laø moät döõ lieäu chia seû ñöôïc (shared data).
Coù 3 loaïi DLL khaùc nhau:
- Thö vieän lieân keát ñoäng API: thuoäc heä thoáng Windows, khi caøi heä ñieàu haønh thì noù ñaõ coù saün. Chuùng ñöôïc naïp khi Windows khôûi ñoäng.
- Thö vieän lieân keát ñoäng third party: do caùc coâng ty khaùc taïo ra treân moâi tröôøng Windows, hoã trôï theâm coâng taùc laäp trình trong Windows.
- Thö vieän lieân keát ñoäng do chuùng ta taïo ra.
Windows söû duïng caáu truùc thö vieän lieân keát ñoäng DLL (Dynamic Link Library) nhaèm muïc ñích khoâng sao cheùp moät khoái löôïng lôùn caùc maõ vaøo trong chöông trình nhö ôû caùc thö vieän thoâng thöôøng. Nhôø caáu truùc ñoäng cuûa DLL neân moïi chöông trình ñeàu coù theå truy caäp thö vieän trong thôøi gian thöïc thi. Caùc haøm API ñöôïc Windows giöõ döôùi daïng hoãn hôïp trong moät soá DLL. Trong quaù trình dòch khi gaëp leänh goïi haøm API töø chöông trình öùng duïng thì chöông trình dòch khoâng theâm maõ naøy vaøo module thöïc hieän maø chæ theâm caùc leänh lieân keát (chöùa teân cuûa DLL beân trong coù haøm caàn naïp) vaø teân haøm ñoù. Khi thöïc thi chöông trình thì haøm API thöïc söï môùi ñöôïc naïp vaøo boä nhôù ñeå thöïc hieän.
Cuøng vôùi söï phaùt trieån cuûa Windows laø söïï phaùt trieån cuûa laäp trình höôùng ñoái töôïng, vaø ñeå hoã trôï cho vieäc laäp trình höôùng ñoái töôïng, Microsoft ñaõ cung caáp cho ngöôøi laäp trình moät boä thö vieän caùc lôùp cô baûn ñeå phaùt trieån caùc öùng duïng höôùng ñoái töôïng goïi laø MFC (Microsoft Foundation Classes), noäi dung cuûa noù bao goàm thoâng tin veà caùc lôùp cô baûn ñöôïc chuaån hoùa nhö lôùp application; document; view; OLE; cöûa soå; nuùt baám; text; v.v…, trong caùc lôùp naøy moïi thöù lieân quan ñeán noù (bao goàm döõ lieäu vaø caùc chöông trình xöû lyù cuûa noù) ñeàu ñöôïc laøm hoaøn chænh, ngöôøi laäp trình chæ vieäc laáy ra söû duïng, hoaëc coù theå theâm bôùt moät ít tính naêng ñaëc tröng cho ñoái töôïng cuûa mình. Muïc tieâu chính cuûa MFC laø heä thoáng hoùa caùc haøm API, cung caáp moät theå thöùc goïi goïn caùc haøm API, cung caáp moät “khung laøm vieäc” (framework) cöïc maïnh ñeå ngöôøi laäp trình khoâng caàn phaûi quan taâm ñeán nhöõng ñoaïn chöông trình thuoäc veà “thuû tuïc” maø chæ caàn quan taâm ñeán phaàn coát loõi ñeå ñaït ñöôïc muïc ñích.
II - THOÂNG ÑIEÄP VAØ XÖÛ LYÙ THOÂNG ÑIEÄP:
1 - Khaùi nieäm:
Laäp trình treân moâi tröôøng Windows khaùc vôùi laäp trình ôû caùc moâi tröôøng khaùc ôû ñieåm laø laäp trình treân Windows luoân luoân gaén lieàn vôùi nhöõng thoâng ñieäp. Moïi hoaït ñoäng xaûy ra treân moät chöông trình Windows ñeàu thoâng qua caùc thoâng ñieäp. Thoâng ñieäp seõ ñöôïc heä thoáng baùo cho caùc öùng duïng bieát caùc taùc ñoäng töø beân ngoaøi vaøo heä thoáng Windows. Moät cöûa soå coù theå gôûi ñi moät thoâng ñieäp cho moät cöûa soå khaùc vaø caùc cöûa soå ñaùp öùng laïi thoâng ñieäp baèng caùch gôûi ñi moät thoâng ñieäp khaùc cho moät cöûa soå khaùc.
Trong Windows coù 3 loaïi thoâng ñieäp cô baûn:
- Nhöõng thoâng ñieäp toång quaùt: coù maõ nhaän dieän mang tieàn toá WM_ ñöôïc coi laø phaàn lôùn trong öùng duïng vaø Windows ñaõ cung caáp caùc haøm ñeå giaûi quyeát.
- Nhöõng control notification: ñaây laø nhöõng thoâng ñieäp WM_COMMAND ñöôïc chuyeån töø cöûa soå con tôùi cöûa soå boá meï.
- Nhöõng nuùt leänh: laø thoâng ñieäp WM_COMMAND phaùt ñi töø trình ñôn, töø caùc nuùt ñieàu khieån. Ñaây laø loaïi thoâng ñieäp yeâu caàu öùng duïng phaûi thöïc hieän moät coâng vieäc gì ñoù.
2 - Gôûi ñi caùc thoâng ñieäp:
Windows cho pheùp öùng duïng gôûi ñi nhöõng thoâng ñieäp cho mình, cho caùc öùng duïng khaùc hoaëc cho heä thoáng.
Coù 3 haøm Windows API ñeå gôûi thoâng ñieäp ñi:
a) Haøm SendMessage:
Cuù phaùp:
LRESULT SendMessage(hwnd, uMsg, wParam, lParam)
HWND hwnd; // handle cuûa cöûa soå nhaän (ñích)
UINT uMsg; // thoâng ñieäp ñeå gôûi
WPARAM wParam; // thoâng soá thoâng ñieäp ñaàu tieân
LPARAM lParam; // thoâng soá thoâng ñieäp thöù hai
- Haøm SendMessage gôûi thoâng ñieäp tôùi moät hay nhieàu cöûa soå. Haøm goïi thuû tuïc cöûa soå cho cöûa soå vaø khoâng trôû veà cho ñeán luùc thuû tuïc cöûa soå ñaõ xöû lyù thoâng ñieäp.
- Giaù trò traû veà: cho bieát keát quaû xöû lyù thoâng ñieäp vaø phuï thuoäc vaøo thoâng ñieäp ñöôïc gôûi.
b) Haøm PostMessage:
- Cuù phaùp:
BOOL PostMessage(hwnd, uMsg, wParam, lParam)
HWND hwnd; // handle cuûa cuûa soå ñích
UINT uMsg; // thoâng ñieäp gôûi
WPARAM wParam; // thoâng soá thoâng ñieäp ñaàu tieân
LPARAM lParam; // thoâng soá thoâng ñieäp thöù hai
- Haøm PostMessage gôûi (ñaët) moät thoâng ñieäp vaøo trong haøng thoâng ñieäp cöûa soå vaø roài trôû veà maø khoâng ñôïi cöûa soå töông öùng xöû lyù thoâng ñieäp. Nhöõng thoâng ñieäp trong moät haøng thoâng ñieäp ñöôïc laáy baèng caùch goïi haøm SetMessage hay PeekMessage.
- Giaù trò traû veà: traû veà khaùc 0 neáu thaønh coâng, ngöôïc laïi 0.
c) Haøm SendDlgItemMessage:
- Cuù phaùp:
LRESULT SendDlgItemMessage(hwndDlg,idDlgItem,uMsg,wParam,lParam)
HWND hwndDlg; // handle cuûa hoäp hoäi thoaïi
int idDlgItem; // maõ nhaän dieän oâ ñieàu khieån seõ nhaän thoâng ñieäp
UINT uMsg; // thoâng ñieäp gôûi ñi
WPARAM wParam; // thoâng soá thoâng ñieäp ñaàu tieân
LPARAM lParam; // thoâng soá thoâng ñieäp thöù hai
- Haøm SendDlgItemMessage gôûi moät thoâng ñieäp tôùi moät ñieàu khieån trong hoäp hoäi thoaïi.
- Giaù trò traû veà: cho bieát keát quaû xöû lyù thoâng ñieäp vaø phuï thuoäc vaøo thoâng ñieäp ñöôïc gôûi.
3 - Voøng laëp thoâng ñieäp:
Moät thread hoaëc moät process ñaåy moät thoâng ñieäp ra khoûi haøng ñôïi baèng caùch duøng voøng laëp thoâng ñieäp. Voøng loop chính cuûa moät öùng duïng ñaët taïi cuoái haøm WinMain() cuûa öùng duïng ñoù. Voøng laëp thoâng ñieäp coù daïng nhö sau:
while GetMessage(&msg,NULL,0,0)
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sau ñaây laø Sô ñoà doøng thoâng ñieäp:
Noù moâ taû ñôn giaûn hoùa quaù trình xöû lyù thoâng ñieäp. Thoâng ñieäp coù theå baét nguoàn töø nhieàu caùch khaùc nhau, sô ñoà sau ñaây seõ giaûi thích chi tieát hôn veà voøng laëp thoâng ñieäp vaø chæ ra caùch thoâng ñieäp ñöôïc ñaët vaøo haøng ñôïi nhö theá naøo:
Thoâng ñieäp khoâng chæ phaùt xuaát töø söï kieän phaàn cöùng, cuõng coù theå coù thoâng ñieäp cuûa chöông trình phaùt xuaát töø moät chöông trình ñang chaïy. Caùc threads coù theå gôûi döõ lieäu trôû veà sau vaø veà tröôùc baèng caùch gôûi thoâng ñieäp. Thoâng ñieäp coù theå gôûi vaøo haøng ñôïi baèng haøm PostMessage() , hoaëc chuùng coù theå ñöôïc gôûi tröïc tieáp cho voøng laëp thoâng ñieäp ñeå xöû lyù ngay laäp töùc baèng haøm SendMessage().
4 - Xöû lyù thoâng ñieäp:
Vieäc xöû lyù thoâng ñieäp laø yeáu toá chính laøm cho caùc öùng duïng Windows vaän haønh ñöôïc. Heä thoáng vaø caùc öùng duïng khaùc sinh ra caùc thoâng ñieäp cho moïi söï kieän xuaát hieän trong heä thoáng thoâng ñieäp cuûa Windows seõ cho pheùp Windows chaïy ña nhieäm trong moät thôøi ñieåm. Windows 95 vaø Windows NT môû roäng khaû naêng cuûa version Windows tröôùc baèng vieäc caáp phaùt cho moãi doøng xöû lyù (thread) hay moãi tieán trình (proccess) moät haøng ñôïi thoâng ñieäp rieâng. Trong version Windows cuõ thì taát caû öùng duïng ñeàu duøng chung moät haøng ñôïi thoâng ñieäp, vì theá ñeå caùc öùng duïng khaùc xöû lyù thoâng ñieäp, öùng duïng phaûi traû quyeàn ñieàu khieån veà cho Windows moãi khi noù coù theå. Vôùi Windows 95 vaø Windows NT, ñieàu naøy khoâng coøn nöõa.
Windows sinh ra thoâng ñieäp cho moïi söï kieän phaàn cöùng, ví duï nhö ngöôøi duøng nhaán moät phím hoaëc di chuyeån chuoät. Noù gôûi thoâng ñieäp ñeán haøng ñôïi thoâng ñieäp cuûa thread thích hôïp, neáu thoâng ñieäp ñöôïc daønh cho nhieàu thread thì noù cuõng ñöôïc ñöa vaøo caùc haøng ñôïi cuûa caùc thread ñoù.
Moät thoâng ñieäp treân thöïc teá laø moät caáu truùc döõ lieäu nhö sau:
typedef struct tagMSG {
HWND hwd; // handle cöûa soå
UINT message; //soá chæ ñònh loaïi message
WPARAM wParam; //ñöôïc chuyeån cho WndProc()
LPARAM wParam; //ñöôïc chuyeån cho WndProc()
DWORD time; //soá mili giaây töø luùc baét ñaàu
POINT pt; //caáu truùc ñieåm POINT
}
III - GIAO DIEÄN THIEÁT BÒ ÑOÀ HOÏA GDI (GRAPHIC DEVICE INTERFACE):
1 - Khaùi nieäm:
Windows laø moät heä ñieàu haønh ña nhieäm (multitasking) trong ñoù caùc öùng duïng giao tieáp vôùi user thoâng qua moät hay nhieàu giao dieän. Ñeå truy xuaát caùc giao dieän thì chöông trình öùng duïng phaûi söû duïng caùc haøm Giao dieän chöông trình öùng duïng. API laø taäp caùc leänh maø moät öùng duïng söû duïng ñeå yeâu caàu vaø tieán haønh caùc dòch vuï caáp thaáp ñöôïc thi haønh bôûi Windows.
Giao dieän thieát bò ñoà hoïa GDI (Graphic Device Interface) laø moät phaàn cuûa API coù nhieäm vuï duy trì söï ñoäc laäp cuûa Windows ñoái vôùi caùc thieát bò ñoà hoïa (cho pheùp Windows laøm vieäc vôùi nhieàu thieát bò ñoà hoïa khaùc nhau). Windows GDI laø moät thö vieän bao goàm moät soá haøm giuùp keát xuaát ñoà hoïa (graphic output) leân maøn hình, maùy in…GDI seõ taïo ra: ñieåm, ñöôøng keû, hình daïng (shape: chöõ nhaät, troøn…), chöõ vaên baûn.
2 - Device Context:
Ngöõ caûnh thieát bò DC (Device Context) laø moät phaàn quan troïng cuûa GDI Windows. Moät DC laø moät caáu truùc döõ lieäu daøi khoaûng 800 bytes ñöôïc Windows duy trì coù nhieäm vuï lo löu giöõ nhöõng thoâng tin caàn thieát maø öùng duïng seõ caàn ñeán khi phaûi hieån thò keát xuaát leân moät thieát bò vaät lyù. GDI khoâng bao giôø cho pheùp chöông trình laøm vieäc tröïc tieáp vôùi moät DC maø GDI phaân phoái cho chöông trình moät handle ñeå nhaän daïng moät DC cuï theå. Taát caû caùc haøm API; GDI ñeàu nhaän thoâng soá ñaàu tieân laø moät handle – hdc.
DC laø moät coâng cuï chöùa caùc thuoäc tính veõ, DC cho pheùp keát noái logic moät chöông trình veà moät thieát bò cuï theå naøo ñoù. Ngoaøi ra do Windows laø moät heä ñieàu haønh ña nhieäm neân caùc chöông trình khoâng theå truy xuaát tröïc tieáp caùc thieát bò vaät lyù ñeå traùnh xung ñoät. Thay vaøo ñoù, chöông trình Windows phaûi söû duïng keát noái logic do DC ñaïi dieän. Nghóa laø taát caû caùc chöông trình caùch tieáp caän naøy ñeå GDI coù theå giaûi quyeát tranh chaáp khi 2 chöông trình yeâu caàu duøng cuøng moät thieát bò neân DC coøn coù vai troø laøm permission slip. DC löu tröõ thoâng tin lieân quan ñeán maët baèng veõ vaø nhöõng khaû naêng cuûa noù. Tröôùc khi söû duïng baát kyø haøm veõ GDI naøo thì ñieàu phaûi taïo moät DC cho thieát bò, vaø khi söû duïng xong thì phaûi traû noù veà cho Windows nhaèm ñaûm baûo cho hoaït ñoäng cuûa heä thoáng ñöôïc thoâng suoát bôûi vì soá löôïng DC maø Windows quaûn lyù laø coù giôùi haïn.
DC ôû Win16: Ngöõ caûnh thieát bò (DC) laø moät noái keát giöõa moät öùng duïng Windows, moät driver thieát bò vaø moät thieát bò ñaàu ra (output device). Windows duy trì moät cache goàm 5 DC ñaëc bieät cho hoaït ñoäng heä thoáng. ÖÙng duïng phaûi giaûi phoùng caùc DC naøy sau khi söû duïng.
Luoàng thoâng tin töø öùng duïng Windows qua DC vaø device driver tôùi thieát bò ñaàu ra:
Truy xuaát thieát bò ñaàu ra (Accessing Output Devices): Baát kyø öùng duïng Windows naøo cuõng coù theå söû duïng haøm GDI ñeå truy xuaát moät thieát bò ñaàu ra. GDI chuyeån caùc goïi ñoäc laäp thieát bò töø öùng duïng tôùi driver thieát bò. Roài driver thieát bò thoâng dòch caùc goïi ñoù vaøo trong söï hoaït ñoäng ñoäc laäp thieát bò.
Nhöõng ñaëc tính cuûa DC moâ taû caùc ñoái töôïng veõ ñöôïc choïn (pens vaø brushes), font ñöôïc choïn vaø maøu cuûa noù, caùch thöùc maø ñoái töôïng ñöôïc veõ (hay aùnh xaï) tôùi thieát bò, vuøng treân thieát bò coù saün cho output (vuøng xeùn) vaø nhöõng thoâng tin quan troïng khaùc. Caáu truùc chöùa nhöõng ñaëc tính DC ñöôïc goïi laø khoái döõ lieäu DC.
Windows
Application
GDI
Device Context
Device
Driver
Output
Device
Windows
Application
Windows
Application
Device
Driver
Device
Driver
Output
Device
Output
Device
3 - Cheá doä aùnh xaï (mapping mode):
Ñeå duy trì söï ñoäc laäp thieát bò, GDI taïo ra output ôû khoâng gian luaän lyù vaø aùnh xaï noù leân maøn hình. Cheá ñoä aùnh xaï cho bieát moái quan heä giöõa khoâng gian luaän lyù vaø nhöõng pixel treân thieát bò.
Coù tôùi 8 cheá ñoä aùnh xaï khaùc nhau nhöng chuùng toâi chæ quan taâm tôùi cheá ñoä aùnh xaï MM_TEXT vì ñaây laø cheá ñoä aùnh xaï maëc ñònh. Trong cheá ñoä naøy moät ñôn vò luaän lyù ñöôïc aùnh xaï tôùi moät pixel treân thieát bò hay maøn hình. Nhö vaäy ñôn vò tính luaän lyù laø pixel vaø caùc toïa ñoä x, y cuõng ñöôïc tính theo pixel, trò x taêng khi qua phaûi vaø giaûm khi qua traùi, trò y taêng khi ñi xuoáng vaø giaûm khi ñi leân. Origin cuûa heä thoáng toïa ñoä laø goùc traùi-treân (upper-left) cuûa maøn hình.
4 - Heä thoáng toïa ñoä windows:
Windows söû duïng caùc heä thoáng toïa ñoä khaùc nhau tuøy theo hoaøn caûnh nhö:
Heä toaï ñoä thieát bò (Device coordinate system)
Heä toaï ñoä toaøn maøn hình (Full screen coordinate system)
Heä toaï ñoä vuøng client (Client area coordinate system)
Heä toaï ñoä toaøn cöûa soå (Whole window coordinate system)
Heä toaï ñoä logic (Logical coordinate system)
Trong phaïm vi öùng duïng cuûa ñeà taøi chuùng toâi chæ quan taâm ñeán caùc heä toaï ñoä :
a) Full screen coordinate system:
Laø heä thoáng toïa ñoä thieát bò lieân quan tôùi troïn maøn hình. Toïa ñoä maøn hình ñöôïc tính theo pixel vaø choïn toïa ñoä (0,0) laøm goùc upper-left cuûa maøn hình. Heä thoáng naøy söû duïng khi lieân quan ñeán troïn maøn hình treân toïa ñoä maøn hình. Thöôøng vò trí cuûa moät ñoái töôïng nhö con nhaùy hoaëc con troû hoaëc cöûa soå so vôùi goùc upper-left cuûa maøn hình thì duøng heä toïa ñoä naøy.
b) Client area coordinate system:
Cuõng laø heä toïa ñoä thieát bò, noù khaùc vôùi heä toïa ñoä troïn maøn hình ôû origin cuûa heä toïa ñoä. Toïa ñoä troïn maøn hình laø töông ñoái so vôùi upper-left cuûa maøn hình coøn toïa ñoä vuøng client laø töông ñoái so vôùi upper-left cuûa vuøng client. Toïa ñoä naøy cuõng tính theo device unit (pixel) gioáng nhö toïa ñoä maøn hình.
Haøm ClientToScreen ñeå chuyeån toïa ñoä vuøng client qua toïa ñoä troïn maøn hình.
Haøm ScreenToClient chuyeån toïa ñoä troïn maøn hình qua toïa ñoä vuøng client.
c) Whole window coordinate system:
Gaàn gioáng heä toïa ñoä vuøng client, laø töông ñoái so vôùi goùc upper-left cuûa cöûa soå, ñöôïc söû duïng khi veõ vuøng nonclient cuûa cöûa soå.
d) Logical coordinate:
Haàu heát caùc haøm GDI söû duïng heä toïa ñoä naøy. Heä thoáng toïa ñoä logic khoâng phaûi laø heä thoáng toïa ñoä thieát bò, heä thoáng toïa ñoä logic bao giôø cuõng ñöôïc aùnh xaï leân moät heä thoáng toïa ñoä thieát bò. Heä toïa ñoä logic coù theå ñöôïc aùnh xaï leân heä toïa ñoä toaøn maøn hình, heä toïa ñoä vuøng client hoaëc heä toïa ñoä toaøn cöûa soå.
Duøng haøm DPtoLP ñeå chuyeån toïa ñoä thieát bò sang heä toïa ñoä logic.
Duøng haøm LPtoDP ñeå chuyeån toïa ñoä logic sang heä toïa ñoä thieát bò.
Nhö vaäy ñieàu quan troïng trong vieäc tính toaùn söû duïng heä toïa ñoä laø phaûi kieåm soaùt ñöôïc vieäc söû duïng caùc heä toïa ñoä moät caùch ñoàng boä bôûi vì vieäc chuyeån ñoåi giöõa caùc heä toïa ñoä ñaõ ñöôïc cung caáp bôûi caùc haøm neâu treân.
5 - Viewport vaø window:
Mapping mode cho bieát aùnh xaï toïa ñoä logic vaø nhöõng kích thöôùc ñöôïc cung caáp khi goïi caùc haøm GDI qua heä thoáng toïa ñoä thieát bò gaén lieàn vôùi DC. Töùc laø mapping mode quyeát ñònh GDI aùnh xaï vieäc aùnh xaï moät window (toïa ñoä logic) qua moät viewport (toïa ñoä thieát bò). Viewport nghóa laø moät vuøng hình chöõ nhaät cuûa heä thoáng toïa ñoä thieát bò ñöôïc ñònh nghóa bôûi moät DC coøn window khi söû duïng ñeå qui chieáu GDI mapping mode laø moät hình chöõ nhaät cuûa heä thoáng toïa ñoä logic ñöôïc ñònh nghóa bôûi moät DC.
Coâng thöùc ñeå chuyeån ñoåi moät heä toïa ñoä window (logic) qua moät heä toïa ñoä viewport (thieát bò):
xviewport = (xwindow - xwindowOrg)(xviewportExt / xwindowExt) + xviewportOrg
yviewport = (ywindow - ywindowOrg)(yviewportExt / ywindowExt) + yviewportOrg
Trong ñoù:
(xwindow,ywindow) laø ñieåm treân toïa ñoä logic ñöôïc chuyeån ñoåi thaønh ñieåm (xviewport,yviewport)
(xwindowOrg,ywindowOrg) vaø (xviewportOrg,yviewportOrg) laø origin cuûa vuøng hình chöõ nhaät window vaø viewport theo maëc nhieân caùc ñieåm naøy ñöôïc cho veà (0,0) treân DC maëc nhieân.
Coâng thöùc söû duïng 2 ñieåm cho bieát extent cuûa moät vuøng theo toïa ñoä logic (xwindowExt,ywindowExt) vaø cuûa moät vuøng theo heä toïa ñoä thieát bò (xviewportExt,yviewportExt).
Tæ leä cuûa (viewpot extent / window extent) laø heä soá scaling duøng ñeå dòch ñôn vò logic qua ñôn vò thieát bò.
Vieäc chuyeån ñoåi ngöôïc laïi töông töï baèng caùc bieán ñoåi coâng thöùc treân.
IV - CÖÛA SOÅ TRONG WINDOWS:
Cöûa soå laø khaùi nieäm cô baûn trong giao dieän GDI cuûa Windows, noù laø moät kieán truùc chuaån möïc ñeå töø ñoù xaây döïng neân caùc ñoái töôïng khaùc nhö: cöûa soå chính cuûa öùng duïng (main frame); text box; edit control; button; combo box; menu; scroll bar;... noùi chung laø toaøn boä nhöõng coâng cuï taïo neân giao dieän GDI ñeàu coù theå goïi laø cöûa soå. Cuõng coù theå xem cöûa soå nhö vuøng chöõ nhaät maøn hình maø nôi ñoù öùng duïng in ra caùc keát xuaát vaø nhaän caùc döõ lieäu töø ngöôøi duøng.
Windows quaûn lyù taát caû cöûa soå hieän coù trong heä thoáng baèng caùch gaùn cho moãi cöûa soå moät handle (treân thöïc teá noù laø moät soá nguyeân)ø, ta chæ caàn coù ñöôïc handle cöûa soå thì coù theå thao taùc moïi thöù treân cöûa soå ñoù.
Moät cöûa soå chia seû maøn hình vôùi caùc cöûa soå khaùc, keå caû caùc cöûa soå cuûa öùng duïng khaùc. Chæ coù moät cöûa soå trong moät thôøi ñieåm coù theå nhaän döõ lieäu nhaäp töø ngöôøi duøng. Ngöôøi duøng coù theå duøng chuoät, baøn phím, hay caùc thieát bò nhaäp khaùc ñeå töông taùc vôùi cöûa soå naøy vaø öùng duïng sôû höõu noù.
1 - Caùc loaïi cöûa soå:
Windows cung caáp nhieàu kieåu cöûa soå khaùc nhau ñeå coù theå keát hôïp hình thaønh neân caùc hình thöùc cöûa soå khaùc nhau. Caùc kieåu ñöôïc söû duïng trong haøm CreateWindow khi cöûa soå ñöôïc taïo.
Moät soá kieåu cöûa soå sau:
- Cöûa soå choàng leân nhau (Overlapped windows hay top-level window): laø cöûa soå khoâng bao giôø coù cöûa soå cha meï.
- Cöûa soå bò sôû höõu (Owned windows): laø kieåu ñaëc bieät, ñöôïc sôû höõu bôûi moät cöûa soå bò choàng
- Cöûa soå pop-up: laø kieåu ñaëc bieät cuûa cöûa soå overlapped nhöng coù theå coù hoaëc khoâng title bar.
- Cöûa soå con: laø cöûa soå xaùc ñònh vuøng client cuûa cöûa soå cha meï, ñöôïc söû duïng ñeå chia vuøng client cuûa cöûa soå cha meï ra thaønh caùc vuøng chöùc naêng khaùc nhau. Moät öùng duïng duøng haøm ShowWindow ñeå cho thaáy hay che daáu moät cöûa soå con. Moãi cöûa soå con phaûi coù moät cöûa soå cha meï. Cöûa soå cha meï nhöôøng moät phaàn trong vuøng cuûa noù cho cöûa soå con vaø cöûa soå con seõ nhaän taát caû caùc taùc ñoäng töø beân ngoaøi vaøo vuøng naøy. Moät cöûa soå con coù theå coù nhieàu cöûa soå con khaùc vaø moãi cöûa soå con ñeàu coù cho rieâng noù moät handle rieâng ñeå giao dòch khi gôûi thoâng ñieäp cho cöûa soå cha meï. Moãi cöûa soå con laø moät cöûa soå ñoäc laäp, noù nhaän taùc ñoäng beân ngoaøi cuûa rieâng noù vaø caùc thoâng ñieäp khaùc. Nhöõng input gôûi cho cöûa soå con ñöôïc ñi tröïc tieáp tôùi cöûa soå con vaø khoâng chuyeån qua cöûa soå cha meï ngoaïi tröø tröôøng hôïp cöûa soå con bò haøm EnabledWindow cho disabled. Trong tröôøng hôïp naøy thì Windows chuyeån baát kyø input naøo tôùi cöûa soå con ñoù cho cöûa soå cha meï cuûa noù. Ñieàu naøy cho pheùp cöûa soå cha meï kieåm tra ñöôïc input vaø laøm cho cöûa soå con ôû traïng thaùi enabled neáu noù thaáy ñieàu ñoù laø caàn thieát.
Nhöõng hoaït ñoäng cuûa cöûa soå cha meï cuõng aûnh höôûng ñeán cöûa soå con nhö sau:
- Shown: Cöûa soå cha meï seõ ñöôïc hieån thò tröôùc cöûa soå con.
- Hidden: Cöûa soå cha meï seõ bò che sau cöûa soå con. Cöûa soå con seõ ñöôïc nhìn thaáy (heát bò che) (visible) chæ khi cöûa soå cha meï ñöôïc nhìn thaáy.
- Destroyed: Cöûa soå cha meï bò huyû sau cöûa soå con.
- Moved: Cöûa soå con bò di chuyeån cuøng vôùi vuøng client cuûa cöûa soå cha meï. Cöûa soå con ñaùp öùng cho vieäc toâ veõ sau khi di chuyeån.
- Gia taêng kích thöôùc hay ôû traïng thaùi kích thöôùc cöïc ñaïi: toâ veõ baát kyø phaàn naøo cuûa cöûa soå cha meï maø ñaõ ñöôïc phôi baøy ra nhö laø keát quaû cuûa kích thöôùc taêng leân cuûa vuøng client.
Windows khoâng töï ñoäng xeùn (clip) moät cöûa soå con ra khoûi vuøng client cuûa cöûa soå cha meï. Ñieàu naøy nghóa laø cöûa soå cha meï veõ leân treân cöûa soå con neáu neáu noù tieán haønh baát kyø söï toâ veõ naøo trong cuøng vò trí vôùi vò trí cuûa cöûa soå con. Windows chæ xeùn cöûa soå con ra khoûi vuøng client cuûa cöûa soå cha meï neáu cöûa soå cha meï coù kieåu WS_CLIPCHILDREN. Neáu cöûa soå con bò xeùn thì cöûa soå cha meï khoâng theå toâ veõ leân noù. Moät cöûa soå con coù theå choàng leân caùc cöûa soå con khaùc trong cuøng vuøng client. Cöûa soå anh em (cuøng cha meï) coù theå toâ veõ trong moãi vuøng client cuûa caùc cöûa soå khaùc tröø khi moät cöûa soå con coù kieåu WS_CLIPSIBLINGS. Neáu öùng duïng xaùc ñònh kieåu naøy cho moät cöûa soå con thì baát kyø phaàn naøo cuûa cöûa soå anh em cuûa cöûa soå con ñoù naèm trong cöûa soå naøy ñeàu bò xeùn. Neáu moät cöûa soå coù kieåu WS_CLIPCHILDREN hoaëc WS_CLIPSIBLINGS thì moät maát maùt nhoû trong söï thöïc hieän (performance) xaûy ra. Moãi cöûa soå chieám taøi nguyeân heä thoáng bôûi vaäy öùng duïng seõ khoâng söû duïng caùc cöûa soå con moät caùch böøa baõi. Ñeå hoaït ñoäng toái öu moät öùng duïng caàn chia luaän lyù cöûa soå chính cuûa noù trong thuû tuïc cöûa soå cuûa cöûa soå chính coøn hôn laø duøng caùc cöûa soå con.
2 - Thuû tuïc cöûa soå (Window Procedures):
Moät thuû tuïc cöûa soå xöû lyù taát caû nhöõng thoâng ñieäp ñöôïc gôûi tôùi taát caû caùc cöûa soå trong lôùp ñöôïc ñöa ra. Windows gôûi caùc thoâng ñieäp tôùi thuû tuïc cöûa soå khi noù nhaän input töø user coù yù ñònh chuyeån cho cöûa soå ñöôïc ñöa ra hay khi noù caàn thuû tuïc ñeå thöïc hieän moät vaøi haønh ñoäng treân cöûa soå cuûa noù nhö vieäc toâ veõ laïi beân trong vuøng client.
Thuû tuïc cöûa soå nhaän caùc kieåu thoâng ñieäp nhö: nhaäp vaøo töø baøn phím, chuoät; yeâu caàu tieâu ñeà cöûa soå; töôøng thuaät söï thay ñoåi gaây ra bôûi cöûa soå khaùc (nhö thay ñoåi file WIN.INI); cô hoäi söûa ñoåi ñaùp öùng heä thoáng tieâu chuaån ñeán nhöõng hoaït ñoäng chaéc chaén (nhö ñieàu chænh menu tröôùc luùc hieån thò); yeâu caàu thöïc hieän moät vaøi haønh ñoäng treân cöûa soå hay vuøng client cuûa noù (caäp nhaät vuøng client); thoâng tin veà tình traïng cuûa noù trong moái quan heä vôùi caùc cöûa soå khaùc (truy xuaá nhaát ñònh thaát baïi cuûa noù tôùi baøn phím hay trôû thaønh cöûa soå hoaït ñoäng).
Moät thuû tuïc cöûa soå nhaän haàu heát caùc thoâng ñieäp laø töø Windows nhöng noù cuõng coù theå nhaän thoâng ñieäp töø caùc cöûa soå khaùc goàm caû nhöõng cöûa soå noù sôû höõu. Nhöõng thoâng ñieäp naøy coù theå laø nhöõng yeâu caàu veà thoâng tin hay thoâ._.ng baùo maø moät sö kieän ñöôïc ñöa ra ñaõ xaûy ra trong moät cöûa soå khaùc. Moät thuû tuïc cöûa soå tieáp tuïc nhaän thoâng ñieäp föø heä thoáng vaø coù theå chaáp nhaän nhöõng cöûa soå khaùc trong heä thoáng cho ñeán khi thuû tuïc cöûa soå, thuû tuïc cöûa soå cuûa moät cöûa soå cha meï hay heä thoáng huûy cöûa soå. Ngay caû khi cöûa soå ôû trong quaù trình ñang bò huûy, thuû tuïc cöûa soå nhaän nhöõng thoâng ñieäp theâm vaøo ñöa tôùi noù cô hoäi ñeå tieán haønh baát kyø nhieäm vuï laøm saïch (cleanup) naøo tröôùc luùc keát thuùc. Nhöõng thoâng ñieäp naøy goàm WM_ , WM_DESTROY, WM_QUERYENDSESSION vaø WM_ENDSESSION. Nhöng khi cöûa soå bò huûy thì khoâng coù theâm thoâng ñieäp naøo ñöôïc ñöa tôùi thuû tuïc cho cöûa soå cuï theå ñoù. Neáu coù nhieàu hôn moät cöûa soå cuûa lôùp, tuy nhieân, thuû tuïc cöûa soå tieáp tuïc nhaän thoâng ñieäp cho nhöõng cöûa soå khaùc cho ñeán khi cuõng chính chuùng bò huûy. Moät thuû tuïc cöûa soå chæ roõ laøm theá naøo taát caû cöûa soå cuûa moät cöûa soå ñöa ra thöïc söï coù haønh vi baèng caùch ñaùp öùng nhöõng gì caùc cöûa soå taïo ra nhöõng leänh töø user hay heä thoáng. Thuû tuïc cöûa soå phaûi kieåm tra nhöõng thoâng ñieäp maø noù nhaän töø heä thoáng vaø quyeát ñònh baát kyø haønh ñoäng gì seõ dieãn ra. Thuû tuïc cöûa soå cuõng coù theå choïn khoâng ñaùp öùng moät thoâng ñieäp ñöôïc ñöa ra. Neáu khoâng ñaùp öùng thuû tuïc phaûi chuyeån thoâng ñieäp tôùi haøm DefWindowProc ñeå ñöa cho heä thoáng cô hoäi ñeå ñaùp öùng. Haøm naøy thöïc hieän haønh ñoäng coù saün treân cô sôû thoâng ñieäp ñöôïc ñöa ra vaø nhöõng thoâng soá cuûa noù. Nhieàu thoâng ñieäp (ñaëc bieät laø thoâng ñieäp vuøng non-client) phaûi ñöôïc xöû lyù vì theá DefWindowProc ñöôïc yeâu caàu trong taát caû caùc thuû tuïc cöûa soå.
Thuû tuïc cöûa soå cuõng nhaän caùc thoâng ñieäp maø thöïc söï ñaõ döï ñònh ñöôïc xöû lyù bôûi heä thoáng. Nhöõng thoâng ñieäp vuøng-nonclient thoâng baùo cho thuû tuïc bieát user thöïc hieän moät vaøi haønh ñoäng trong vuøng client cuûa cöûa soå hoaëc moät vaøi thoâng tin veà cöûa soå ñöôïc yeâu caàu bôûi heä thoáng ñeå thöïc hieän moät haønh ñoäng. Maëc duø Windows chuyeån nhöõng thoâng ñieäp naøy tôùi thuû tuïc cöûa soå thì thuû tuïc seõ chuyeån chuùng cho haøm DefWindowProc vaø khoâng coá gaéng xöû lyù chuùng. ÔÛ tröôøng hôïp naøy thuû tuïc cöûa soå phaûi phôùt lôø thoâng ñieäp hay traû veà khoâng chuyeån noù tôùi DefWindowProc.
3) Thoâng ñieäp cöûa soå:
Moät thoâng ñieäp cöûa soå laø moät taäp nhöõng giaù trò maø Windows gôûi tôùi thuû tuïc cöûa soå ñeå cung caáp input cho cöûa soå hay yeâu caàu cöûa soå thöïc hieän moät vaøi haønh ñoäng. Windows tính ñeán moät söï thay ñoåi roäng khaép nhöõng thoâng ñieäp maø noù hay öùng duïng cuûa noù coù theå gôûi tôùi thuû tuïc cöûa soå. Haàu heát nhöõng thoâng ñieäp ñöôïc gôûi tôùi cöûa soå nhö laø keát quaû cuûa haøm ñöa ra ñang ñöôïc thöïc thi hay nhö laø keát quaû cuûa input töø user. Moãi thoâng ñieäp goàm 4 giaù trò: moät handle xaùc ñònh cöûa soå, moät danh hieäu thoâng ñieäp, moät giaù trò thoâng ñieäp-ñaëc bieät 16-bit vaø moät giaù trò thoâng ñieäp-ñaëc bieät 32-bit. Nhöõng giaù trò naøy ñöôïc chuyeån tôùi thuû tuïc cöûa soå nhö laø nhöõng thoâng soá rieâng leû. Roài thuû tuïc cöûa soå kieåm tra danh hieäu thoâng ñieäp ñeå quyeát ñònh nhöõng ñaùp öùng gì phaûi laøm vaø laøm theá naøo ñeå thoâng dòch giaù trò 16-bit vaø 32-bit.
Cuù phaùp thuû tuïc cöûa soå:
LONG FAR PASCAL WndProc(hwnd, wMsg, wParam, lParam)
HWND hwnd;
WORD wMsg;
WORD wParam;
DWORD lParam;
Caùc thoâng soá:
hwnd cho bieát cöûa soå nhaän thoâng ñieäp
wMsg loaïi thoâng ñieäp
wParam thoâng tin thoâng ñieäp-ñaëc bieät theâm vaøo 16-bit
lParam thoâng tin thoâng ñieäp-ñaëc bieät theâm vaøo 32-bit
Haøm traû veà giaù trò 32-bit cho bieát keát quaû xöû lyù thoâng ñieäp
4 - Default window procedure:
Haøm DefWindowProc laø phaàn xöû lyù thoâng ñieäp coù saün cho nhöõng thuû tuïc cöûa soå khoâng hay khoâng theå truy xuaát moät vaøi thoâng ñieäp ñöôïc gôûi tôùi cho chuùng. Haàu heát caùc thuû tuïc cöûa soå thì haøm DefWindowProc thöïc hieän haàu heát, neáu khoâng muoán noùi laø taát caû, vieäc xöû lyù thoâng ñieäp vuøng client. Ñaây laø caùc thoâng ñieäp bieåu hieän nhöõng haønh ñoäng ñöôïc thöïc hieän treân caùc phaàn khaùc cuûa cöûa soå hôn laø vuøng client.
5 - Vaán ñeà toâ veõ maøn hình:
Khi moät cöûa soå bò di chuyeån thì Windows töï ñoäng sao cheùp noäi dung cuûa vuøng client tôùi vò trí môùi. Ñieàu naøy tieát kieäm thôøi gian bôûi vì moät cöûa soå khoâng phaûi tính toaùn laïi vaø veõ laïi noäi dung cuûa vuøng client nhö laø phaàn cuûa söï di chuyeån. Neáu cöûa soå di chuyeån hay thay ñoåi kích thöôùc thì Windows chæ sao cheùp phaàn lôùn vuøng client tröôùc ñoù khi noù caàn ñieàn vò trí môùi. Neáu cöûa soå gia taêng kích thöôùc thì Windows sao cheùp toaøn boä vuøng client vaø gôûi thoâng baùo WM_PAINT tôùi cöûa soå ñeå ñieàn vaøo trong vuøng ñöôïc phôi baøy môùi hôn. Khi cöûa soå bò di chuyeån thì Windows cho raèng noäi dung cuûa vuøng client vaãn hôïp leä vaø coù theå ñöôïc sao cheùp khoâng caàn thay doåi tôùi vò trí môùi. Tuy nhieân vôùi moät vaøi cöûa soå thì noäi dung cuûa vuøng client khoâng coøn hôïp leä sau khi di chuyeån ñaëc bieät laø neáu di chuyeån luoân söï thay ñoåi kích thöôùc. Ñeå toâ veõ laïi toaøn boä vuøng client thay cho sao cheùp noäi dung tröôùc ñoù moãi laàn moät cöûa soå thay ñoåi kích thöôùc thì moät cöûa soå seõ xaùc ñònh kieåu CS_VREDRAW vaø trong lôùp cöûa soå.
Ñeå quaûn lyù hieån thò maøn hình, Windows tieán haønh nhieàu hoaït ñoäng aûnh höôûng tôùi noäi dung cuûa vuøng client. Neáu Windows di chuyeån, ñònh kích thöôùc hay thay ñoåi beà maët maøn hình, söï thay ñoåi coù theå aûnh höôûng cöûa soå ñöôïc ñöa ra. Neáu vaäy, Windows ñaùnh daáu vuøng bò thay ñoåi baèng hoaït ñoäng saün saøng cho vieäc caäp nhaät vaø ôû cô hoäi tieáp theo noù gôûi thoâng ñieäp WM_PAINT tôùi cöûa soå vì theá noù coù theå caäp nhaät cöûa soå trong vuøng caàn caäp nhaät. Neáu moät cöûa soå veõ trong vuøng client cuûa noù thì noù phaûi goïi BeginPaint ñeå laáy handle cuûa ngöõ caûnh maøn hình, phaûi caäp nhaät vuøng bò thay ñoåi nhö ñaõ ñònh nghóa bôûi vuøng caäp nhaät vaø cuoái cuøng noù phaûi goïi EndPaint ñeå hoaøn taát coâng vieäc. Moät cöûa soå coù theå veõ trong vuøng client cuûa noù baát kyø luùc naøo töùc laø ngoaøi thôøi ñieåm maø noù ñaùp öùng thoâng ñieäp WM_PAINT chæ caàn noù laáy ngöõ caûnh maøn hình cho vuøng client tröôùc luùc noù tieán haønh veõ.
Thoâng ñieäp WM_PAINT: laø moät yeâu caàu cuûa Windows tôùi moät cöûa soå ñeå caäp nhaät maøn hình cöûa noù. Windows gôûi WM_PAINT baát cöù khi naøo caàn veõ moät phaàn laïi cöûa soå. Khi cöûa soå nhaän thoâng ñieäp WM_PAINT thì noù seõ laáy vuøng caäp nhaät baèng haøm BeginPaint vaø noù seõ tieán haønh baát kyø hoaït ñoäng gì caàn thieát ñeå caäp nhaät phaàn ñoù cuûa vuøng client.
InvalidateRect vaø InvalidateRgn thöïc söï khoâng sinh ra thoâng ñieäp WM_PAINT. Windows tích luyõ nhöõng thay ñoåi ñöôïc taïo ra bôûi caùc haøm naøy vaø nhöõng thay ñoåi cuûa rieâng noù trong luùc moät cöûa soå xöû lyù nhöõng thoâng ñieäp khaùc trong haøng thoâng ñieäp cuûa noù. Laøm treã WM_PAINT laøm cho cöûa soå xöû lyù taát caû nhöõng thay ñoåi cuøng moät luùc thay vì caäp nhaät nhöõng nhöõng maãu nhoû trong nhöõng böôùc rieâng leû laøm laõng phí thôøi gian.
Ñeå chæ thò Windows gôûi thoâng ñieäp WM_PAINT moät öùng duïng coù theå söû duïng UpdateWindow, haøm naøy gôûi thoâng ñieäp tröïc tieáp tôùi cöûa soå, baát chaáp nhöõng thoâng ñieäp khaùc trong haøng thoâng ñieäp cuûa öùng duïng. UpdateWindow ñöôïc söû duïng khi moät cöûa soå caàn caäp nhaät vuøng client cuûa noù ngay laäp töùc (chaúng haïn chæ ngay sau cöûa soå ñöôïc taïo). Khi moät cöûa soå nhaän WM_PAINT noù phaûi goïi BeginPaint ñeå laáy ngöõ caûnh maøn hình cho vuøng client vaø laáy thoâng tin khaùc nhö vuøng caäp nhaät vaø background bò xoùa hay khoâng. Windows töï ñoäng choïn vuøng caäp nhaät nhö laø vuøng xeùn cuûa ngöõ caûnh maøn hình. GDI huyû boû (xeùn) nhöõng gì ñöôïc veõ beân ngoaøi vuøng xeùn chæ nhöõng gì ôû beân trong vuøng caäp nhaät laø thöïc söï nhìn thaáy ñöôïc. BeginPaint xoùa vuøng caäp nhaät ñeå ngaên chaën vuøng gioáng nhau töø vieäc sinh ra caùc thoâng ñieäp WM_PAINT ñeán sau. Sau khi veõ xong Windows phaûi goïi haøm EndPaint ñeå giaûi phoùng DC.
Vuøng caäp nhaät: Moät vuøng caäp nhaät xaùc ñònh phaàn cuûa vuøng client ñöôïc ñaùnh daáu cho vieäc veõ cho thoâng ñieäp WM_PAINT keá tieáp. Muïc ñích cuûa vuøng caäp nhaät laø ñeå löu caùc öùng duïng thôøi ñieåm noù ñöa ra ñeå veõ toaøn boä noäi dung cuûa vuøng client. Neáu chæ coù phaàn maø caàn veõ ñöôïc coäng vaøo vuøng caäp nhaät thì chæ coù phaàn ñoù ñöôïc veõ.
Haøm InvalidateRect vaø InvalidateRgn coäng moät hình chöõ nhaät hay moät vuøng vaøo vuøng caäp nhaät. Hình chöõ nhaät hay vuøng phaûi ñöôïc ñöa ra ôû trong toïa ñoä client. Vuøng caäp nhaät baûn thaân noù ñöôïc ñònh nghóa trong toïa ñoä client. Windows coäng nhöõng vuøng vaø hình chöõ nhaät cuûa chính noù vaøo moät vuøng caäp nhaät cuûa cöûa soå sau khi nhöõng hoaït ñoäng nhö di chuyeån, ñònh kích thöôùc vaø cuoän cöûa soå.
Haøm ValidateRect vaø ValidateRgn xoùa moät hình chöõ nhaät hay moät vuøng ra khoûi vuøng caäp nhaät. Nhöõng haøm naøy ñöôïc söû duïng ñieån hình khi cöûa soå ñaõ caäp nhaät moät phaàn ñaëc bieät cuûa maøn hình trong vuøng caäp nhaät tröôùc khi nhaän thoâng ñieäp WM_PAINT.
Haøm GetUpdateRect laáy hình chöõ nhaät nhoû nhaát bao laáy toaøn boä vuøng caäp nhaät. Haøm GetUpdateRgn laáy vuøng caäp nhaät chính noù. Nhöõng haøm naøy coù theå ñöôïc söû duïng ñeå tính toaùn kích thöôùc hieän haønh cuûa vuøng caäp nhaät ñeå quyeát ñònh nhöõng coâng vieäc veõ naøo ñöôïc yeâu caàu.
V – CHÖÔNG TRÌNH WINDOWS TIEÁP NHAÄN THOÂNG ÑIEÄP CHUOÄT:
Giôùi thieäu doøng chaûy döõ lieäu thoâng ñieäp nhaäp töø con chuoät:
Hardware event queue
Device driver
Mouse
GetMessage() DispatchMessage()
WindowProc()
DefWindowProc()
Hook chain
Virtual &
Scan code
1 - Mouse:
Khi mouse baùo vò trí cuûa mình (vò trí cursor) vaø coù taùc ñoäng leân mouse thì moät tín hieäu ñöôïc phaùt ñi töø mouse gaây ra moät ngaét quaõng, mouse driver giaûi quyeát ngaét quaõng naøy.
2 - Mouse device driver:
Khi Windows khôûi ñoäng thì mouse driver töï ñoäng naïp vaøo vaø kieåm tra xem coù chuoät hay khoâng. Neáu coù thì Windows goïi driver cung caáp moät thuû tuïc ñeå baùo caùo caùc bieán coá xaûy ra treân chuoät. Khi coù moät mouse event thì driver thoâng baùo cho Windows bieát. Neáu event laø di chuyeån mouse thì öu tieân ñaùp öùng vò trí con troû di chuyeån ngay luùc ngaét. Coøn laïi taát caû caùc event khaùc ñeàu ñöôïc ñöa vaøo hardware event queue.
3 - Hardware event queue:
Caùc mouse event ñöôïc ñöa vaøo hardware event queue chôø giao cho message loop cuûa chöông trình giaûi quyeát. Queu naøy laø moät vuøng ñeäm coù theå chöùa toái ña 120 event. Nhöõng event trong queue chöa thuoäc moät chöông trình cuï theå naøo cho tôùi khi noù ñöôïc tieáp nhaän bôûi haøm GetMessage(). Ñieàu naøy ñaûm baûo cho heä thoáng hoaït ñoäng ñuùng ñaén. Sau ñoù laø voøng laëp GetMessage().
4 - GetMessage() loop:
GetMessage() loop ñöa caùc thoâng ñieäp vaøo xöû lyù. GetMessage() seõ quyeát ñònh chöông trình naøo seõ tieáp nhaän thoâng ñieäp baèng caùch xem chöông trình naøo sôû höõu cöûa soå maø con troû chuoät naèm treân ñoù. Tuøy theo vò trí cuûa con troû maø phaùt sinh hai loaïi thoâng ñieäp: thoâng ñieäp vuøng client vaø thoâng ñieäp vuøng non-client. Muoán bieát cursor ôû vuøng naøo thì GetMessage() chuyeån ñi moät thoâng ñieäp WM_NCHITTEST cho thuû tuïc cöûa soå. Haøm GetMessage() döïa vaøo cô cheá pull-model ñeå ñoïc thoâng tin tình huoáng trong queue vaø laïi döïa vaøo push-model ñeå bieát vò trí cuûa cursor. Töùc laø GetMessage() seõ goïi thuû tuïc cöûa soå nhö laø moät chöông trình thöôøng truù vaäy. GetMessage() söû duïng haøm SendMessage() ñeå goïi thuû tuïc cöûa soå. Trò traû veà naèm trong phaïm vi cuûa thoâng ñieäp WM_NCHITTEST maø GetMessage() gôûi cho thuû tuïc cöûa soå cuûa ta. WM_NCHITTEST laø thoâng ñieäp ñeán ñaàu tieân trong haøng loaït thoâng ñieäp maø mouse phaùt ra. Noù yeâu caàu thuû tuïc cöûa soå nhaän dieän vò trí cursor. Ña soá chöông trình chuyeån thoâng ñieäp naøy cho DefWindowProc() lo tìm vò trí cursor vaø cung caáp moät hit-test code nhö laø trò traû veà.
Khi DefWindowProc() traû veà keát quaû khaùc HTCLIENT, HTERROR, HTNOWHERE, HTTRANSPARENT thì cursor naèm treân vuøng non-client thì Windows seõ phaùt ñi thoâng ñieäp non-client.
Coøn khi DefWindows traû veà keát quaû HTCLIENT thì cursor naèm treân vuøng client vaø nhöõng thoâng ñieäp do Windows phaùt ñi luùc naøy thì seõ ñöôïc trình öùng duïng xöû lyù.
Haøm SendMessage() seõ söû duïng maõ hit-test code ñeå quyeát ñònh xem loaïi thoâng ñieäp chuoät naøo maø cho phaùt sinh. Khi hit-test code baèng HTCLIENT thì moät thoâng ñieäp vuøng client seõ ñöôïc phaùt sinh coøn taát caû caùc hit-test code khaùc seõ phaùt sinh ra nhöõng thoâng ñieäp chuoät vuøng non-client.
Tröôùc khi SendMessage() traû veà moät thoâng ñieäp chuoät cho chöông trình cuûa ta thì coù moät vieäc maø haøm naøy phaûi thi haønh: noù phaûi baûo ñaûm laø hình daùng cursor phuø hôïp vò trí hieän thôøi cuûa mouse. Muoán theá noù phaûi gôûi ñi moät thoâng ñieäp khaùc cho thuû tuïc cöûa soå WM_GETCURSOR. Töông töï nhö thoâng ñieäp WM_NCHITTEST ña soá chöông trình phôùt lôø thoâng ñieäp naøy vaø giao cho DefWindowProc() thöïc hieän. Maõ hit-test code ñöôïc cho ôû trong byte thaáp cuûa thoâng soá lParam ñeå cho DefWindowProc() bieát maø thieát ñaët hình daùng cuûa con troû.
Hai thoâng ñieäp WM_NCHITTEST vaø WM_SETCURSOR bao giôø cuõng ñi tröôùc moät thoâng ñieäp chuoät. Vì Windows phaûi tìm ra xem vò trí cursor hieän ôû trong vuøng client hay vuøng non-client ñeå phaùt ra thoâng ñieäp vuøng client hay thoâng ñieäp vuøng non-client moät caùch thích hôïp. Moät khi ñaõ ñöôïc nhaän dieän thì Windows phaûi ñaûm baûo laø ngöôøi söû duïng nhaän ñöôïc hình daùng cursor thích hôïp.
Windows cho pheùp ñaët message hook ñeå thay ñoåi doøng chaûy caùc thoâng ñieäp. Moät WH_GETMESSAGE hook coù theå thay ñoåi doøng chaûy cuûa baát cöù thoâng ñieäp chuoät cuûa vuøng client hoaëc vuøng non-client. Khi GetMessage() saün saøng ñem moät thoâng ñieäp vaøo chöông trình cuûa ta thì noù seõ goïi hook xem coù thay ñoåi gì khoâng tröôùc khi thoâng ñieäp ñöôïc chuyeån cho chöông trình.
Khi GetMessage() ñaõ ñöa thoâng ñieäp vaøo chöông trình roài thì thoâng ñieäp seõ ñöôïc trao tröïc tieáp cho thuû tuïc cöûa soå thích hôïp bôûi haøm DispatchMessage(). Baây giôø thoâng ñieäp ñaõ naèm trong thuû tuïc cöûa soå.
5 - Thuû tuïc cöûa soå:
Hôn 20 thoâng ñieäp cuûa Windows veà chuoät (tröø WM_NCHITTEST) thì coù 10 thoâng ñieäp thuoäc vuøng non-client do DefWindowProc() giaûi quyeát. Hai thoâng soá wParam, lParam cuûa thuû tuïc cöûa soå seõ cho bieát thoâng tin veà thoâng ñieäp. Trò cuûa hai thoâng soá lParam vaø wParam ñeàu töông töï nhau cho caùc thoâng ñieäp chuoät treân vuøng client.
Trò cuûa thoâng soá lParam chöùa vò trí cursor theo toïa ñoä cuûa vuøng client. Toïa ñoä naøy cho origin veà goùc upper-left cuûa vuøng client vôùi ñôn vò tính laø pixel. Trò x naèm ôû word thaáp coøn y naèm ôû word cao cuûa lParam.
Trò cuûa wParam laø moät loâ côø hieäu moâ taû traïng thaùi cuûa caùc nuùt chuoät cuõng nhö traïng thaùi caùc nuùt ,
6 – DefWindowProc():
Ñoái vôùi chuoät thì DefWindowProc() khoâng quan taâm ñeán nhöõng thoâng ñieäp thuoäc vuøng client maø chæ quan taâm ñeán nhöõng thoâng ñieäp thuoäc vuøng non-client.
DefWindowProc() coù nhieäm vuï cung caáp moät giao dieän chung cho baøn phím vaø con chuoät baèng caùch dòch phaàn nhaäp lieäu töø baøn phím hoaëc con chuoät thaønh caùc leänh heä thoáng (system command) vaø cho hieän leân nhö caùc thoâng ñieäp WM_SYSCOMMAND. Cuoái cuøng DefWindowProc() giaûi quyeát caùc thoâng ñieäp WM_NCHITTEST vaø WM_SETCURSOR cung caáp tröôùc cho caùc thoâng ñieäp chuoät khaùc.
Chöông 2:
TÌM HIEÅU VEÀ HOOKS
Hook laø moät cô cheá cöïc maïnh cho pheùp ta caøi ñaët moät thuû tuïc ñeå ñieàu khieån hoaëc chaän höùng caùc thoâng ñieäp tröôùc khi caùc thoâng ñieäp naøy tôùi ñöôïc nôi tieáp nhaän.
Hay noùi moät caùch khaùc hook laø moät ñieåm trong kyõ thuaät message-handling heä thoáng, nôi maø moät öùng duïng coù theå ñaët moät thuû tuïc ñeå quaûn lyù söï löu thoâng cuûa caùc thoâng ñieäp trong heä thoáng vaø xöû lyù moät kieåu thoâng baùo naøo ñoù tröôùc khi chuùng tôùi ñöôïc thuû tuïc cöûa soå ñích.
Do coù khaû naêng can thieäp maïnh neân hook coù xu höôùng laøm chaäm laïi heä thoáng vì chuùng laøm taêng soá löôïng caùc hoaït ñoäng cuûa heä thoáng ñoái vôùi moãi thoâng ñieäp. Chæ ñaët hook khi thöïc söï caàn thieát vaø dôõ boû chuùng khi khoâng caàn ñeán.
1 - Chuoãi hook:
Heä thoáng cho pheùp nhieàu kieåu hook khaùc nhau: moãi kieåu cung caáp vieäc truy xuaát tôùi moät khía caïnh khaùc nhau cuûa kyõ thuaät message-handling. Chaúng haïn, moät öùng duïng coù theå söû duïng hook WM_MOUSE ñeå quaûn lyù nhöõng thoâng ñieäp chuoät trong luoàng thoâng ñieäp.
Heä thoáng duy trì moät chuoãi hook rieâng leû ñoái vôùi moãi kieåu hook. Moät chuoãi hook laø moät danh saùch caùc pointer chæ tôùi caùc haøm callback application-defined ñaëc bieät maø nhöõng haøm naøy goïi caùc thuû tuïc hook. Khi moät thoâng ñieäp xaûy ra laø noù ñaõ ñöôïc toå chöùc vôùi moät kieåu hook cuï theå, heä thoáng chuyeån thoâng ñieäp tôùi moãi thuû tuïc hook coù maët trong chuoãi hook, theo traät töï caùi noï sau caùi kia. Hoaït ñoäng cuûa moät thuû tuïc hook coù theå phuï thuoäc vaøo kieåu hook maø noù lieân quan. Caùc thuû tuïc hook cho moät vaøi kieåu hook coù theå chæ quaûn lyù nhöõng thoâng ñieäp; nhöõng caùi khaùc coù theå thay ñoåi nhöõng thoâng ñieäp hay döøng söï phaùt trieån cuûa noù trong chuoãi, ngaên chaën chuùng tìm tôùi thuû tuïc hook keá tieáp hay cöûa soå cuoái cuøng (ñích).
2 – Thuû tuïc hook:
Ñeå coù ñöôïc söï tieän lôïi cuûa moät loaïi hook chi tieát, ngöôøi laäp trình cung caáp moät thuû tuïc hook vaø söû duïng haøm SetWindowsHookEx ñeå ñaët noù vaøo trong chuoãi hook. Moät thuû tuïc hook coù cuù phaùp:
LRESULT CALLBACK HookProc (
Int nCode,
WPARAM wParam,
LPARAM lParam
);
HookProc laø moät placeholder cho moät öùng duïng ñaõ ñöôïc ñònh nghóa tröôùc.
Thoâng soá nCode laø moät maõ hook phuï thuoäc vaøo kieåu hook; moãi kieåu coù moät taäp caùc ñaëc tính caùc maõ hook. Nhöõng giaù trò cuûa thoâng soá wParam vaø lParam phuï thuoäc vaøo maõ hook, nhöng ñieån hình thì chuùng chöùa thoâng tin veà moät thoâng ñieäp ñöôïc send hay ñöôïc post. Haøm SetWindowsHookEx luoân luoân ñaët moät thuû tuïc hook ôû ñaàu moät chuoãi hook. Khi moät söï kieän xaûy ra maø söï kieän naøy ñöôïc quaûn lyù bôûi moät kieåu hook cuï theå thì heä thoáng goïi thuû tuïc ôû ñaàu chuoãi hook ñaõ ñöôïc toå chöùc. Moãi thuû tuïc hook trong chuoãi quyeát ñònh neân chuyeån hay khoâng chuyeån söï kieän tôùi thuû tuïc tieáp theo. Moät thuû tuïc hook chuyeån moät söï kieän tôùi thuû tuïc tieáp theo baèng caùch goïi haøm CallNextHookEx. Chuù yù raèng nhöõng thuû tuïc hook daønh cho caùc kieåu hook chæ coù theå quaûn lyù caùc thoâng ñieäp, heä thoáng chuyeån thoâng ñieäp tôùi moãi thuû tuïc hook, chöù khoâng dính daùng gì ñeán coù hay khoâng moät thuû tuïc cuï theå goïi CallNextHookEx. Moät thuû tuïc hook coù theå toaøn cuïc, quaûn lyù nhöõng thoâng ñieäp ñoái vôùi taát caû caùc thread trong heä thoáng hay noù coù theå laø thread cuï theå, quaûn lyù caùc thoâng ñieäp cho chæ moät thread rieâng bieät. Moät thuû tuïc hook toaøn cuïc coù theå ñöôïc goïi trong ngöõ caûnh cuûa baát kyø öùng duïng naøo, bôûi theá thuû tuïc phaûi ôû trong moät module DLL rieâng leû. Moät thuû tuïc hook loaïi thread cuï theå chæ ñöôïc goïi trong ngöõ caûnh cuûa thread ñaõ ñöôïc toå chöùc. Neáu moät öùng duïng ñaët moät thuû tuïc hook cho moät trong caùc thread cuûa rieâng noù thì thuû tuïc hook coù theå ôû trong caû module gioáng nhau nhö quaõng nghó giöõa caùc maõ öùng duïng hoaëc trong moät DLL. Neáu öùng duïng ñaët moät thuû tuïc hook cho moät thread cuûa moät öùng duïng khaùc thì thuû tuïc phaûi ôû trong moät DLL. Chuù yù chæ söû duïng hook toaøn cuïc cho muïc ñích debug coøn khoâng thì neân traùnh khoâng söû duïng. Hook toaøn cuïc coù theå gaây toån haïi cho hoaït ñoäng cuûa heä thoáng vaø gaây neân xung ñoät vôùi nhöõng öùng duïng khaùc coù cuøng kieåu hook toaøn cuïc.
3 – Caùc loaïi hook:
Moät loaïi hook laøm cho moät öùng duïng coù theå quaûn lyù moät maët khaùc nhau cuûa kyõ thuaät message-handling heä thoáng.
Bao goàm caùc loaïi hook sau ñaây:
WH_CALLWNDPROC hook quaûn lyù caùc thoâng ñieäp tröôùc luùc heä thoáng gôûi chuùng tôùi cöûa soå ñích.
WH_CALLWNDPROCRET hook quaûn lyù caùc thoâng ñieäp sau khi chuùng ñöôïc xöû lyù bôûi thuû tuïc cöûa soå ñích.
WH_CBT hook nhaän nhöõng thoâng baùo coù ích tôùi öùng duïng huaán luyeän treân cô sôû tính toaùn (CBT).
WH_DEBUG hook coù ích cho vieäc debug nhöõng thuû tuïc hook khaùc.
WH_FOREGROUNDIDLE hook seõ ñöôïc goïi khi thread foreground cuûa öùng duïng seõ trôû thaønh khoâng duøng ñeán. Hook naøy coù ích cho hoaït ñoäng nhöõng nhieäm vuï (task) ñoä öu tieân thaáp trong thôøi gian khoâng ñöôïc duøng ñeán.
WH_GETMESSAGE hook quaûn lyù caùc thoâng ñieäp ñöôïc post tôùi haøng thoâng ñieäp.
WH_JOURNALPLAYBACK hook post nhöõng thoâng ñieäp ñöôïc ghi tröôùc ñoù bôûi thuû tuïc hook WH_JOURNALRECORD.
WH_JOURNALRECORD hook ghi nhöõng thoâng ñieäp ñaàu vaøo ñöôïc post tôùi haøng thoâng ñieäp heä thoáng. Hook naøy coù ích cho vieäc ghi caùc macro.
WH_KEYBOARD hook quaûn lyù caùc thoâng ñieäp keystroke.
WH_KEYBOARD_LL Windows NT: hook quaûn lyù nhöõng söï kieän nhaäp vaøo töø keyboard möùc thaáp.
WH_MOUSE hook quaûn lyù caùc thoâng ñieäp chuoät.
WH_MOUSE_LL Windows NT: hook quaûn lyù nhöõng söï kieän ñaàu vaøo chuoät möùc thaáp.
WH_MSGFILTER hook quaûn lyù caùc thoâng ñieäp ñöôïc keát sinh nhö laø moät keát quaû cuaû söï kieän ñaàu vaøo ôû trong dialog box, message box, menu hay scroll bar.
WH_SHELL hook quaûn lyù caùc thoâng ñieäp nhaän thoâng baùo höõu ích ñeå shell caùc öùng duïng.
WH_SYSMSGFILTER ñaët moät öùng duïng caùc thoâng ñieäp ñöôïc keát sinh nhö laø keát quaû cuûa moät söï kieän ñaàu vaøo ôû trong dialog box, message box, menu hay scroll bar. Thuû tuïc hook quaûn lyù nhöõng thoâng ñieäp naøy cho taát caû caùc öùng duïng trong heä thoáng.
4 – Söû duïng hook:
a) Caøi ñaët hook:
Ñaët moät thuû tuïc hook baèng caùch goïi haøm SetWindowsHookEx ñaëc taû kieåu hook goïi thuû tuïc, thuû tuïc coù phaûi ñöôïc toå chöùc vôùi taát caû caùc thread hay chæ ñöôïc toå chöùc vôùi moät thread cuï theå vaø moät pointer chæ tôùi moät ñieåm vaøo thuû tuïc. Phaûi ñaët moät thuû tuïc hook toaøn cuïc vaøo moät DLL rieâng bieät töø öùng duïng caøi ñaët thuû tuïc hook. ÖÙng duïng caøi ñaët phaûi coù handle chæ tôùi module DLL tröôùc khi noù coù theå ñaët thuû tuïc hook. Haøm LoadLibrary khi ñöôïc ñöa teân cuûa DLL seõ traû handle cho module DLL. Sau khi coù handle, coù theå goïi haøm GetProcAddress ñeå laáy laïi ñòa chæ cuûa thuû tuïc hook. Cuoái cuøng söû duïng haøm SetWindowsHookEx ñeå ñaët ñòa chæ hook vaøo trong chuoãi hook daønh rieâng. SetWindowsHookEx chuyeån handle module, moät pointer chæ tôùi ñieåm vaøo thuû tuïc hook vaø cho danh hieäu thread, chæ ra raèng thuû tuïc hook phaûi ñöôïc toå chöùc vôùi taát caû caùc thread trong heä thoáng.
Ví duï minh hoïa:
HOOKPROC hkprcSysMsg;
static HINSTANCE hinstDLL;
static HHOOK hhookSysMsg;
hinstDLL = LoadLibrary("c:\windows\sysmsg.dll");
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, SysMessageProc);
hhookSysMsg = SetWindowsHookEx( WH_SYSMSGFILTER,
hkprcSysMsg, hinstDLL, 0 );
b) Giaûi phoùng hook:
Coù theå giaûi phoùng moät procedure loaïi thread cuï theå töùc xoùa ñòa chæ cuûa noù khoûi chuoãi hook baèng caùch goïi haøm UnhookWindowsHookEx nhöng haøm naøy khoâng traû töï do cho DLL chöùa thuû tuïc hook. Ñaây laø lyù do maø thuû tuïc hook toaøn cuïc ñöôïc goïi trong ngöõ caûnh quaù trình cuûa moãi öùng duïng trong heä thoáng, gaây neân moät goïi tuyeät ñoái tôùi haøm LoadLibrary cho taát caû caùc quaù trình ñoù. Bôûi vì moät goïi tôùi haøm FreeLibrary khoâng theå ñöôïc taïo ra cho moät quaù trình khaùc, roài thì khoâng coù caùch naøo ñeå giaûi phoùng cho DLL. Heä thoáng cuoái cuøng giaûi phoùng DLL sau khi taát caû caùc quaù trình noái hoaøn toaøn vôùi DLL ñaõ keát thuùc hay goïi FreeLibrary vaø taát caû caùc quaù trình ñaõ goïi thuû tuïc hook laïi tieáp tuïc quaù trình xöû lyù beân ngoaøi DLL. Moät phöông phaùp löïa choïn cho vieäc ñaët thuû tuïc toaøn cuïc laø cung caáp moät haøm caøi ñaët trong DLL, cuøng vôùi thuû tuïc hook. Vôùi phöông phaùp naøy, öùng duïng caøi ñaët khoâng caàn handle chæ tôùi module DLL. Baèng caùch noái vôùi DLL, öùng duïng gia taêng vieäc truy xuaát tôùi haøm caøi ñaët. Haøm caøi ñaët coù theå cung caáp handle module DLL vaø nhöõng chi tieát khaùc ôû trong caùi goïi tôùi SetWindowsHookEx. DLL cuõng coù theå chöùa moät haøm giaûi phoùng thuû tuïc hook toaøn cuïc; öùng duïng coù theå goïi haøm giaûi phoùng hook naøy khi keát thuùc.
5 – Hook trong Windows 3.x:
Hook laø moät ñieåm trong kyõ thuaät message-handling cuûa Windows maø moät öùng duïng coù theå söû duïng ñeå laøm taêng khaû naêng truy xuaát tôùi doøng thoâng ñieäp. Windows cung caáp nhieàu kieåu hook khaùc nhau, moãi kieåu cho pheùp truy xuaát tôùi moät kieåu thoâng ñieäp cuï theå hay moät vuøng caùc thoâng ñieäp. Ñeå coù ñöôïc moät hook cuï theå thì moät öùng duïng coù theå caøi ñaët moät haøm loïc (filter function) ñeå xöû lyù nhöõng thoâng ñieäp ñöôïc toå chöùc vôùi hook. Moät haøm loïc xöû lyù nhöõng thoâng ñieäp tröôùc khi chuùng ñeán thuû tuïc cöûa soå ñích.
Chuoãi haøm loïc (Filter-Function Chain):
Moät chuoãi haøm loïc laø moät loaït nhöõng haøm loïc hoï haøng cho moät hook heä thoáng cuï theå. Moät öùng duïng chuyeån moät haøm loïc cho moät hook heä thoáng baèng caùch goïi haøm SetWindowsHook. Moãi laàn goïi thì coäng theâm moät haøm loïc môùi vaøo ñaàu cuûa chuoãi. Baát cöù khi naøo moät öùng duïng chyeån ñòa chæ moät haøm loïc cho hook heä thoáng noù phaûi giöõ vuøng nhôù cho ñòa chæ haøm loïc keá tieáp trong chuoãi. SetWindowsHook caøi moät haøm hook vaøo chuoãi hook vaø traû veà handle cuûa hook. Khi moãi haøm loïc hoaøn thaønh nhieäm vuï noù phaûi goïi haøm DefHookProc, haøm naøy söû duïng ñòa chæ ñöôïc löu trong vò trí ñöôïc giöõ bôûi öùng duïng ñeå truy xuaát haøm loïc keá tieáp trong chuoãi. Ñeå xoùa moät haøm loïc trong chuoãi loïc moät öùng duïng phaûi goïi haøm UnhookWindowsHook vôùi thoâng soá laø kieåu hook vaø moät con troû chæ tôùi haøm.
Sau ñaây laø caùc hook cöûa soå tieâu chuaån:
Kieåu Chöùc naêng
WH_CALLWNDPROC Caøi ñaët loïc cöûa soå
WH_CBT Caøi ñaët loïc computer-based training (CBT)
WH_DEBUG Caøi ñaët loïc debug
WH_GETMESSAGE Caøi ñaët loïc thoâng ñieäp (chæ treân nhöõng version debug)
WH_HARDWARE Caøi ñaët loïc thoâng ñieäp-phaàn cöùng khoâng tieâu chuaån
WH_JOURNALPLAYBACK Caøi ñaët loïc journaling playback
WH_JOURNALRECORD Caøi ñaët loïc journaling record
WH_KEYBOARD Caøi ñaët loïc baøn phím
WH_MOUSE Caøi ñaët loïc thoâng ñieäp chuoät
WH_MSGFILTER Caøi ñaët loïc thoâng ñieäp
WH_SYSMSGFILTER Caøi ñaët loïc thoâng ñieäp treân toaøn heä thoáng
Trong ñoù hook WH_CALLWNDPROC vaø WH_GETMESSAGE aûnh höôûng hoaït ñoäng cuûa heä thoáng, chæ söû duïng ñeå debug.
Ñeå caøi ñaët moät haøm loïc thì öùng duïng phaûi traûi qua 4 böôùc:
1 - Export haøm trong file .DEF
2 - Laáy ñòa chæ haøm baèng caùch duøng haøm GetProcAddress (MakeProcInstance chæ ñöôïc söû duïng khi haøm loïc khoâng ôû trong moät DLL)
3 - Goïi SetWindowsHook , xaùc ñònh kieåu haøm hook vaø ñòa chæ cuûa haøm (ñöôïc traû veà bôûi GetProcAddress)
4 - Löu giaù trò traû veà töø SetWindowsHook trong vò trí ñöôïc giöõ. Giaù trò naøy laø handle cuûa haøm loïc tröôùc.
Nhöõng haøm cho hook toaøn heä thoáng phaûi ñöôïc cho vaøo trong moät DLL.
Nhö vaäy qua nhöõng lyù thuyeát veà hook trong moâi tröôøng Win32 hay trong moâi tröôøng Win16 cho chuùng ta coù nhaän xeùt: duøng kyõ thuaät hook cho pheùp ta ñaët moät thuû tuïc ñeå theo doõi, ñieàu khieån vaø xöû lyù caùc thoâng ñieäp cuûa heä thoáng Windows theo yù cuûa ta tröôùc luùc thoâng ñieäp ñoù ñeán ñöôïc cöûa soå ñích. Tuy nhieân kyõ thuaät hook ôû trong moâi tröôøng Win32 maïnh hôn, noù coù theå cho pheùp ta thöïc hieän ñöôïc caùc coâng vieäc coù vai troø töông töï nhö kyõ thuaät override trong Win16.
6 - Giôùi thieäu moät soá haøm coù lieân quan ñeán hook:
a) CallMsgFilter:
- Cuù phaùp:
BOOL CallMsgFilter(lpmsg, nCode)
MSG FAR* lpmsg;
int nCode;
- CallMsgFilter chuyeån thoâng ñieäp ñöa ra vaø maõ tôùi haøm loïc thoâng ñieäp hieän haønh. Haøm loïc thoâng ñieäp laø moät haøm ñaëc taû öùng duïng kieåm tra vaø söûa ñoåi taát caû caùc thoâng ñieäp. Moät öùng duïng xaùc ñònh haøm baèng caùch söû duïng haøm SetWindowsHook.
- Thoâng soá:
lpmsg troû tôùi caáu truùc MSG chöùa thoâng ñieäp ñöôïc loïc.
nCode xaùc ñònh moät maõ ñöôïc söû duïng bôûi haøm loïc ñeå quyeát ñònh laøm theá naøo ñeå truy xuaát thoâng ñieäp.
- Giaù trò traû veà: chæ ra traïng thaùi cuûa quaù trình xöû lyù thoâng ñieäp. Traû veà 0 neáu thoâng ñieäp ñöôïc xöû lyù vaø khaùc 0 neáu thoâng ñieäp khoâng ñöôïc xöû lyù.
- Chuù yù: haøm CallMsgFilter thöôøng ñöôïc goïi bôûi Windows ñeå cho caùc öùng duïng kieåm tra vaø ñieàu khieån luoàng thoâng ñieäp trong suoát quaù trình xöû lyù noäi ôû trong menu, scroll bar hay khi di chuyeån hoaëc laøm thay ñoåi kích thöôùc moät cöûa soå.
b) SetWindowsHookEx:
- Cuù phaùp:
HHOOK SetWindowsHookEx(idHook, hkprc, hinst, htask)
int idHook;
HOOKPROC hkprc;
HINSTANCE hinst;
HTASK htask;
- Haøm SetWindowsHookEx caøi ñaët moät haøm hook application-defined vaøo trong moät chuoãi hook. Haøm naøy laø version môû roäng cuûa haøm SetWindowsHook.
- Thoâng soá:
idHook Kieåu cuûa hook ñöôïc caøi ñaët. Thoâng soá naøy goàm caùc kieåu hook nhö ñaõ trình baøy ôû phaàn lyù thuyeát neâu treân.
hkprc Ñòa chæ procedure-instance cuûa thuû tuïc hook application-defined ñöôïc caøi ñaët.
hinst Instance._.
LÖU ÑOÀ HAØM TRÍCH TÖØ TRONG DOØNG TEXT TAÏI
TOÏA ÑOÄ FullScreen pt (GTDLL - GetWordUnderPoint)
Tính khung bao cuûa doøng text (haøm GetTextExtent)
Hieäu chænh laïi vò trí khung bao vaø toaï ñoä xuaát text
tuøy theo giaù trò cuûa GetTextAlign nhö sau:
- Caäp nhaät CP: Gaùn laïi toaï ñoä TextOut laø CP
- Traùi/giöõa/phaûi: Chænh toaï ñoä traùi/phaûi
- Ñænh/ñaùy/baseline: Chænh toaï ñoä treân/döôùi
Tinh chænh laïi mIndex baèng caùch:
- Tính khung bao chuoãi text töø 1 ñeán mIndex ñeå
suy ra toaï ñoä cuûa kyù töï mIndex treân maøn hình
- Xeùt xem pt naèm beân traùi hay beân phaûi mIndex
- Neáu pt beân phaûi thì taêng mIndex roài loop laïi
cho ñeán khi pt qua traùi.
- Neáu pt beân traùi thì giaûm mIndex roài loop laïi
cho ñeán khi pt qua phaûi.
Yes
No
Baét ñaàu
- Töø vò trí mIndex, ñaët voøng loop queùt doø qua traùi
- Xeùt xem vò trí ñang doø coù phaûi laø space hoaëc tab
- Voøng loop keát thuùc khi doø ñöôïc vò trí space hoaëc
tab, hoaëc doø ñeán vò trí ñaàu chuoãi (vò trí 1).
* Keát quaû ñaït ñöôïc: Vò trí ñaàu cuûa töø.
Keát thuùc
LÖU ÑOÀ GIAÛI THUAÄT TRÍCH TÖØ TRONG DOØNG TEXT
TAÏI VÒ TRÍ mIndex (môû roäng löu ñoà GetWordUnderPoint)
- Töø vò trí mIndex, ñaët voøng loop queùt doø qua phaûi
- Xeùt xem vò trí ñang doø coù phaûi laø space hoaëc tab
- Voøng loop keát thuùc khi doø ñöôïc vò trí space hoaëc
tab, hoaëc doø ñeán vò trí cuoái chuoãi (chieàu daøi chuoãi).
* Keát quaû ñaït ñöôïc: Vò trí cuoái cuûa töø.
- Töø vò trí ñaàu vaø vò trí cuoái cuûa töø, deã daøng
trích töø ra baèng haøm trích chuoãi con: strncpy
III – Giôùi thieäu moät soá haøm coù lieân quan:
1) Haøm InvalidateRect:
Haøm InvalidateRect coäng moät hình chöõ nhaät vaøo moät vuøng caäp nhaät cuûa cöûa soå. Vuøng caäp nhaät ñaïi dieän cho vuøng client cuûa cöûa soå phaûi ñöôïc veõ laïi.
- Cuù phaùp:
void InvalidateRect(hwnd, lprc, fErase)
HWND hwnd;
const RECT FAR* lprc;
BOOL fErase;
-Thoâng soá:
hwnd cöûa soå maø vuøng caäp nhaät cuûa noù thay ñoåi
lprc chæ tôùi ñòa chæ caáu truùc RECT chöùa toïa ñoä client cuûa hình chöõ nhaät ñöôïc coäng theâm vaøo vuøng caäp nhaät. Neáu NULL thì toaøn boä vuøng client ñöôïc coäng vaøo vuøng caäp nhaät
fErase xaùc ñònh coù hay khoâng coù background ôû trong vuøng caäp nhaät bò xoùa khi vuøng caäp nhaät ñöôïc xöû lyù. Neáu TRUE thì background bò xoùa khi BeginPaint ñöôïc goïi, neáu NULL thì background vaãn khoâng thay ñoåi.
- Giaù trò traû veà: haøm khoâng traû veà giaù trò naøo caû.
2) Haøm InvalidateRgn:
Haøm InvalidateRgn coäng moät vuøng vaøo vuøng caäp nhaät cuûa cöûa soå. Vuøng caäp nhaät ñaïi dieän cho vuøng client cuûa cöûa soå phaûi ñöôïc veõ laïi.
- Cuù phaùp:
void InvalidateRgn(hwnd, hrgn, fErase)
HWND hwnd;
HRGN hrgn;
BOOL fErase;
- Thoâng soá:
hwnd cöûa soå maø vuøng caäp nhaät cuûa noù thay ñoåi
hrgn vuøng ñöôïc coäng vaøo vuøng caäp nhaät. Vuøng phaûi coù toïa ñoä client. Neáu NULL thì toaøn vuøng client ñöôïc coäng vaøo vuøng caäp nhaät.
fErase xaùc ñònh cof1 hay khoâng background bò xoùa khi vuøng caäp nhaät ñöôïc xöû lyù. Neáu TRUE thì background bò xoùa khi BeginPaint ñöôïc goïi. Neáu FALSE thì background vaãn khoâng ñoåi.
- Giaù trò traû veà: haøm khoâng traû veà giaù trò gì.
3) Haøm UpdateWindow:
Haøm caäp nhaät vuøng client cuûa cöûa soå baèng caùch gôûi moät thoâng ñieäp WM_PAINT tröïc tieáp tôùi cöûa soå neáu vuøng caäp nhaät cho cöûa soå laø khoâng troáng. Haøm gôûi thoâng ñieäp WM_PAINT tröïc tieáp tôùi thuû tuïc cöûa soå cuûa cöûa soå boû qua haøng öùng duïng. Neáu vuøng caäp nhaät troáng thì khoâng coù thoâng ñieäp naøo ñöôïc gôûi.
- Cuù phaùp:
void UpdateWindow(hwnd)
HWND hwnd;
- Thoâng soá:
hwnd cöûa soå caàn caäp nhaät
- Giaù trò traû veà: haøm khoâng traû veà giaù trò
4 – Haøm ñaët hook SetWindowsHookEx:
- Haøm SetWindowsHookEx caøi ñaët moät thuû tuïc hook ñònh nghóa öùng duïng vaøo moät chuoãi hook. Caøi ñaët thuû tuïc hook ñeå quaûn lyù heä thoáng cho kieåu söï kieän naøo ñoù. Nhöõng söï kieän naøy ñöôïc toå chöùc vôùi caû thread ñaëc bieät hay vôùi caû taát caû thread trong heä thoáng.
- Cuù phaùp:
HHOOK SetWindowsHookEx(
Int idHook, // kieåu hook ñeå caøi ñaët
HOOKPROC lpfn, // ñòa chæ cuûa thuû tuïc hook
HINSTANCE hMod, // handle chæ tôùi theå hieän cuûa öùng duïng
DWORD dwThreadId // nhaän daïng cuûa thread ñeå ñaët hook
);
- Caùc thoâng soá:
Idhook kieåu thuû tuïc hook ñöôïc ñaët, goàm caùc giaù trò sau:
WH_CALLWNDPROC ñaët moät thuû tuïc hook quaûn lyù caùc thoâng ñieäp tröôùc luùc heä thoáng gôûi chuùng tôùi cöûa soå ñích.
WH_CALLWNDPROCRET ñaët moät thuû tuïc hook quaûn lyù caùc thoâng ñieäp sau khi chuùng ñöôïc xöû lyù bôûi thuû tuïc cöûa soå ñích.
WH_CBT ñaët moät thuû tuïc hook nhaän nhöõng thoâng baùo coù ích tôùi öùng duïng huaán luyeän treân cô sôû tính toaùn (CBT).
WH_DEBUG ñaët moät thuû tuïc hook coù ích cho vieäc debug nhöõng thuû tuïc hook khaùc.
WH_FOREGROUNDIDLE ñaët moät thuû tuïc hook seõ ñöôïc goïi khi thread foreground cuûa öùng duïng seõ trôû thaønh khoâng duøng ñeán. Hook naøy coù ích cho hoaït ñoäng nhöõng nhieäm vuï (task) ñoä öu tieân thaáp trong thôøi gian khoâng ñöôïc duøng ñeán.
WH_GETMESSAGE ñaët moät thuû tuïc hook quaûn lyù caùc thoâng ñieäp ñöôïc post tôùi haøng thoâng ñieäp.
WH_JOURNALPLAYBACK ñaët moät thuû tuïc hook post nhöõng thoâng ñieäp ñöôïc ghi tröôùc ñoù bôûi thuû tuïc hook WH_JOURNALRECORD.
WH_JOURNALRECORD ñaët moät thuû tuïc hook ghi nhöõng thoâng ñieäp ñaàu vaøo ñöôïc post tôùi haøng thoâng ñieäp heä thoáng. Hook naøy coù ích cho vieäc ghi caùc macro.
WH_KEYBOARD ñaët moät thuû tuïc hook quaûn lyù caùc thoâng ñieäp keystroke.
WH_KEYBOARD_LL Windows NT: ñaët moät thuû tuïc hook quaûn lyù nhöõng söï kieän nhaäp vaøo töø keyboard möùc thaáp.
WH_MOUSE ñaët moät thuû tuïc hook quaûn lyù caùc thoâng ñieäp chuoät.
WH_MOUSE_LL Windows NT: ñaët moät thuû tuïc hook quaûn lyù nhöõng söï kieän ñaàu vaøo chuoät möùc thaáp.
WH_MSGFILTER ñaët moät thuû tuïc hook quaûn lyù caùc thoâng ñieäp ñöôïc keát sinh nhö laø moät keát quaû cuaû söï kieän ñaàu vaøo ôû trong dialog box, message box, menu hay scroll bar.
WH_SHELL ñaët moät thuû tuïc hook quaûn lyù caùc thoâng ñieäp nhaän thoâng baùo höõu ích ñeå shell caùc öùng duïng.
WH_SYSMSGFILTER ñaët moät öùng duïng caùc thoâng ñieäp ñöôïc keát sinh nhö laø keát quaû cuûa moät söï kieän ñaàu vaøo ôû trong dialog box, message box, menu hay scroll bar. Thuû tuïc hook quaûn lyù nhöõng thoâng ñieäp naøy cho taát caû caùc öùng duïng trong heä thoáng.
lpfn troû tôùi thuû tuïc hook. Neáu dwThreadId baèng 0 hay ñaëc taû danh hieäu moät thread ñöôïc taïo ra bôûi moät quaù trình khaùc, lpfn phaûi chæ tôùi moät thuû tuïc hook trong moät DLL. Coøn khoâng, lpfn coù theå troû tôùi moät thuû tuïc hook trong code ñöôc toå chöùc vôùi quaù trình hieän thôøi.
hMode handle chæ tôùi DLL chöùa thuû tuïc hook ñöôïc troû tôùi bôûi lpfn. hMode phaûi ñöôïc ñaët NULL neáu dwThread ñaëc taû moät thread ñöôïc taïo bôûi quaù trình hieän haønh vaø neáu thuû tuïc hook ôû trong code ñöôïc toå chöùc vôùi quaù trình hieän haønh.
dwThreadId ñaëc taû danh hieäu cuûa thread vôùi thuû tuïc hook ñaõ ñöôïc toå chöùc, neáu laø 0 thì thuû tuïc hook ñöôïc toå chöùc vôùi taát caû caùc thread ñang toàn taïi.
Giaù trò traû veà: laø handle chæ tôùi thuû tuïc hook neáu thaønh coâng vaø NULL neáu thaát baïi.
- Ghi chuù: loãi coù theå xaûy ra neáu thoâng soá hMode laø NULL vaø dwThreadId = 0 hay ñaëc taû danh hieäu cuûa moät thread ñöôïc taïo ra bôûi moät quaù trình khaùc.
Taàm vöïc cuûa hook phuï thuoäc vaøo kieåu hook. Moät vaøi hook coù theå ñöôïc ñaët chæ vôùi taàm vöïc heä thoáng, nhöõng hook khaùc cuõng ñöôïc ñaët chæ cho moät thread ñaëc bieät, ñaây laø danh saùch:
Hook Taàm vöïc
WH_CALLWNDPROC thread hay system
WH_CALLWNDPROCRET thread hay system
WH_CBT thread hay system
WH_DEBUG thread hay system
WH_FOREGROUNDIDLE thread hay system
WH_GETMESSAGE thread hay system
WH_JOURNALPLAYBACK chæ system
WH_JOURNALRECORD chæ system
WH_KEYBOARD thread hay system
WH_KEYBOARD_LL thread hay system
WH_MOUSE thread hay system
WH_MOUSE_LL thread hay system
WH_MSGFILTER thread hay system
WH_SYSMSGFILTER thread hay system
WH_SHELL chæ system
Vôùi moät loaïi hook ñaõ ñaëc taû thì hook thread ñöôïc goïi tröôùc roài môùi ñeán hook heä thoáng. Hook heä thoáng laø nhöõng taøi nguyeân ñöôïc chia seû vaø khi ñaët moät caùi seõ aûnh höôûng leân taát caû caùc öùng duïng. Taát caû caùc haøm hook heä thoáng phaûi ôû trong caùc thö vieän. Hook heä thoáng neân ñöôïc xöû lyù cho nhöõng öùng duïng coù muïc ñích ñaëc bieät hay ñeå söû duïng nhö laø moät trôï giuùp (aid) ñaëc bieät trong khi debug öùng duïng. Caùc thö vieän khoâng caàn hook thì neân gôû boû thuû tuïc hook.
5 - Haøm WindowFromPoint:
- Haøm naøy laáy handle cuûa cöûa soå chöùa ñieåm ñaõ ñöôïc xaùc ñònh.
- Cuù phaùp:
HWND WindowFromPoint (
POINT Point // caáu truùc ñieåm
);
- Thoâng soá:
Point : ñieåm ñöôïc kieåm tra
- Giaù trò traû veà: Laø moät handle cuûa cöûa soå chöùa ñieåm. Neáu khoâng coù cöûa soå naøo chöùa ñieåm ñoù thì giaù trò traû veà laø NULL. Neáu ñieåm naèm trong ñieàu khieån text tónh (static text control) thì giaù trò traû veà laø handle cuûa cöûa soå naèm beân döôùi ñieàu khieån text tónh.
- Ghi chuù: Haøm WindowFromPoint khoâng laáy moät handle cuûa moät cöûa soå bò che hay khoâng hoaït doäng ñöôïc, ngay caû neáu ñieåm ôû trong cöûa soå. Moät öùng duïng seõ söû duïng haøm ChildWindowFromPoint cho vieäc tìm kieám khoâng coù giôùi haïn. Haøm naøy yeâu caàu toái thieåu laø Windows 95, Header ñöôïc khai baùo trong winuser.h, söû duïng thö vieän user32.lib
6 – Haøm ChildWindowFromPoint:
- Haøm ChildWindowFromPoint xaùc ñònh roõ nhöõng cöûa soå con naøo thuoäc veà moät cöûa soå cha meï chöùa ñieåm ñaõ cho.
- Cuù phaùp:
HWND ChildWindowFromPoint (
HWND hWndParent, // handle cuûa cöûa soå cha meï
POINT Point // caáu truùc toïa ñoä ñieåm
);
- Thoâng soá:
hWndParent Handle cuûa cöûa soå cha meï.
Point Caáu truùc POINT ñònh nghóa toïa ñoä client cuûa ñieåm ñöôïc kieåm tra.
- Giaù trò traû veà: Laø handle cuûa cöûa soå con chöùa ñieåm contains the point ngay caû trong tröôøng hôïp cöûa soå con bò che hay khoâng theå hoaït ñoäng hidden or disabled. Neáu ñieåm naèm ngoaøi cöûa soå cha meï thì giaù trò traû veà laø NULL. Neáu ñieåm ôû trong cöûa soå cha meï nhöng khoâng ôû trong baát kyø cöûa soå con naøo thì traû veà handle cuûa cöûa soå cha meï.
- Ghi chuù: Heä thoáng duy trì danh saùch noäi, chöùa handle caùc cöûa soå con ñöôïc toå chöùc baèng moät cöûa soå cha meï. Thöù tö caùc handle trong danh saùch phuï thuoäc vaøo traät töï Z cuûa nhöõng cöûa soå con. Neáu coù nhieàu hôn moät cöûa soå con chöùa ñieåm thì heä thoáng traû veà handle cuûa cöûa soå ñaàu tieân trong danh saùch maø coù chöùa ñieåm. Haøm naøy ñoøi hoûi toái thieåu Windows 95, Header: ñöôïc khai baùo trong winuser.h, söû duïng Import Library user32.lib.
7 – Haøm ChildWindowFromPointEx:
- Haøm ChildWindowFromPointEx xaùc ñònh roõ nhöõng cöûa soå con thuoäc veà cöûa soå cha meï chöùa ñieåm. Haøm coù theå phôùt lôø cöûa soå con khoâng nhìn thaáy, khoâng theå hoaït ñoäng ñöôïc vaø trong suoát.
- Cuù phaùp:
HWND ChildWindowFromPointEx(
HWND hwndParent, // handle cuûa cöûa soå cha meï
POINT pt, // caáu truùc toïa ñoä ñieåm
UINT uFlags // nhöõng côø boû quaõng
);
- Thoâng soá:
hwndParent Handle cuûa cöûa soå cha meï.
pt caáu truùc POINT ñònh nghóa toïa ñoä client cuûa ñieåm ñöôïc kieåm tra.
uFlags cho bieát nhöõng cöûa soå con bò boû, coù theå keát hôïp caùc giaù trò sau:
Giaù trò
YÙ nghóa
CWP_ALL
Khoâng boû baát kyø cöûa soå con naøo
CWP_SKIPINVISIBLE
Boû nhöõng cöûa soå con khoâng nhìn thaáy
CWP_SKIPDISABLED
Boû nhöõng cöûa soå con khoâng theå hoaït ñoäng
CWP_SKIPTRANSPARENT
Boû nhöõng cöûa soå con trong suoát
- Giaù trò traû veà: Laø handle cuûa cöûa soå con ñaàu tieân chöùa ñieåm vaø baét gaëp tieâu chuaån (critia) ñöôïc ñaëc taû bôûi uFlags. Neáu ñieåm ôû trong cöûa soå cha meï nhöng khoâng ôû trong baát kyø cöûa soå con naøo baét gaëp tieâu chuaån thì giaù trò traû veà laø handle cuûa cöûa soå cha meï. Neáu ñieåm naèm ngoaøi cöûa soå cha meï hay neáu haøm thaát baïi thì giaù trò traû veà laø NULL.
- Ghi chuù: Heä thoáng duy trì moät danh saùch noäi chöùa handle cuûa nhöõng cöûa soå con ñöôïc toå chöùc baèng cöûa soå cha meï. Thöù töï cuûa caùc handle trong danh saùch phuï thuoäc vaøo traät töï Z cuûa nhöõng cöûa soå con. Neáu coù nhieàu hôn moät cöûa soå con chöùa ñieåm thì heä thoáng traû veà handle cuûa cöûa soå ñaàu tieân trong danh saùch chöùa ñieåm vaø baét gaëp tieâu chuaån trong uFlags. Haøm naøy ñoøi hoûi toái thieåu Windows 95, Header: ñöôïc khai baùo trong winuser.h, söû duïng Import Library user32.lib.
8 - Haøm GetWindowText:
- Haøm GetWindowText sao cheùp text thanh tieâu ñeà cuûa cöûa soå ñaõ ñöôïc ñaëc taû (neáu noù coù moät) vaøo moät vuøng ñeäm. Neáu cöûa soå ñöôïc ñaëc taû laø moät ñieàu khieån thì text cuûa ñieàu khieån ñöôïc sao cheùp. Tuy nhieân, GetWindowText khoâng theå laáy text cuûa ñieàu khieån trong moät öùng duïng khaùc.
- Cuù phaùp:
int GetWindowText(
HWND hWnd, // handle cuûa cöûa soå hay ñieàu khieån coù chöùa text
LPTSTR lpString, // ñòa chæ cuûa vuøng ñeäm cho text
int nMaxCount // soá cöïc ñaïi nhöõng kyù töï ñeå sao cheùp
);
- Thoâng soá:
hWnd Handle cuûa cöûa soå hay ñieàu khieån coù chöùa text.
lpString Pointer chæ tôùi vuøng ñeäm seõ nhaän text.
nMaxCount soá löôïng cöïc ñaïi caùc kyù töï cheùp tôùi vuøng ñeäm tính luoân caû kyù töï, NULL. Neáu ñoaïn text vöôït quaù giôùi haïn naøy thì noù seõ bò caét bôùt.
- Giaù trò traû veà: Neáu thaønh coâng thì traû veà ñoä daøi caùc kyù töï trong chuoãi ñöôïc cheùp khoâng tính kyù töï roãng cuoái chuoãi. Neáu cöûa soå khoâng coù thanh tieâu ñeà hay ñoaïn text, hay neáu thanh tieâu ñeà roãng hay neáu handle cuûa cöûa soå hoaëc thanh tieâu ñeà khoâng hôïp leä thì giaù trò traû veà laø zero. Haøm naøy khoâng theå laáy ñoaïn text cuûa moät edit control trong öùng duïng khaùc.
- Ghi chuù: Neáu cöûa soå ñích thuoäc sôû höõu bôûi quaù trình hieän haønh, haøm GetWindowText taïo neân thoâng ñieäp WM_GETTEXT ñeå gôûi tôùi ñieàu khieån hay cöûa soå ñöôïc ñaëc taû. Neáu cöûa soå ñích ñöôïc sôû höõu bôûi moät quaù trình khaùc vaø coù moät ñaàu ñeà (caption) thì haøm GetWindowText laáy phaàn text caption cuûa cöûa soå. Neáu cöûa soå khoâng coù caption thì giaù trò traû veà laø moät chuoãi roãng. Haøm naøy ñoøi hoûi toái thieåu Windows 95, Header: ñöôïc khai baùo trong winuser.h, söû duïng Import Library user32.lib.
9 - Haøm MouseProc:
Thuû tuïc hook MouseProc laø moät haøm callback ñònh nghóa thö vieän hay ñònh nghóa öùng duïng söû duïng haøm SetWindowsHookEx. Heä thoáng goïi haøm naøy baát cöù khi naøo moät öùng duïng goïi haøm GetMessage hay PeekMessage vaø coù moät thoâng ñieäp chuoät ñöôïc xöû lyù.
Kieåu HOOKPROC ñònh nghóa moät pointer troû tôùi haøm callback. MouseProc laø moät placeholder cho teân haøm ñònh nghóa öùng duïng hay teân haøm ñònh nghóa thö vieän.
- Cuù phaùp:
LRESULT CALLBACK MouseProc (
Int nCode, // hook code
WPARAM wParam, // danh hieäu thoâng ñieäp
LPARAM lParam // toïa ñoä chuoät
);
- Thoâng soá:
nCode moät code thuû tuïc hook söû duïng ñeå quyeát ñònh laøm theá naøo ñeå xöû lyù thoâng ñieäp, coù theå coù giaù trò:
Giaù trò YÙ nghóa
HC_ACTION wParam vaø lParam chöùa thoâng tin moät thoâng ñieäp chuoät
HC_NOREMOVE wParam vaø lParam chöùa thoâng tin moät thoâng ñieäp chuoät, vaø thoâng ñieäp chuoät khoâng bò xoùa khoûi haøng message.
Neáu nCode nhoû hôn 0 thì thuû tuïc hook phaûi chuyeån thoâng ñieäp tôùi haøm CallNextHookEx khoâng caàn xöû lyù theâm vaø neân traû veà giaù trò ñöôïc traû veà bôûi CallNextHookEx.
wParam chöùa danh hieäu cuûa thoâng ñieäp chuoät
lParam laø pointer troû tôùi caáu truùc MOUSEHOOKSTRUCT
- Giaù trò traû veà: Neáu nCode = 0 vaø thuû tuïc hook khoâng xöû lyù thoâng ñieäp noù ñeà nghò baïn goïi CallNextHookEx vaø traû veà giaù trò noù traû veà ngöôïc laïi nhöõng öøng duïng khaùc ñaõ ñaët hook WM_MOUSE seõ khoâng nhaän thoâng baùo hook vaø coù theå ñoái xöû chính xaùc nhö laø moät keát quaû. Neáu thuû tuïc hook ñaõ xöû lyù thoâng ñieäp thì noù traû veà moät giaù trò khaùc 0 ñeå ngaên chaën heä thoáng chuyeån thoâng ñieäp tôùi thuû tuïc cöûa soå ñích.
- Ghi chuù: Moät öùng duïng ñaët thuû tuïc hook baèng caùch ñaëc taû kieåu hook WH_MOUSE vaø ñòa chæ cuûa thuû tuïc hook trong moät goïi tôùi haøm SetWindowsHookEx. Thuû tuïc hook phaûi khoâng ñaët haøm callback JournalPlayBackProc.
10 - Haøm RedrawWindow:
Haøm RedrawWindow caäp nhaät hình chöõ nhaät hay vuøng ñöa ra vaøo trong vuøng client cuûa cöûa soå.
- Cuù phaùp:
BOOL RedrawWindow( hwnd, lprcUpdate,
hrgnUpdate, fuRedraw)
HWND hwnd;
const RECT FAR* lprcUpdate;
HRGN hrgnUpdate;
UINT fuRedraw;
- Thoâng soá:
hwnd Cöûa soå caàn ñöôïc veõ laïi. Neáu NULL thì cöûa soå desktop ñöôïc caäp nhaät.
lprcUpdate chæ tôùi caáu truùc RECT chöùa toïa ñoä cuûa hình chöõ nhaät caäp nhaät. Thoâng soá naøy bò phôùt lôø neáu hrgnUpdate chöùa handle vuøng hôïp leä.
hrgnUpdate vuøng caäp nhaät. Neáu caû hrgnUpdate vaø lprcUpdate ñeàu NULL thì toaøn boä vuøng client cuûa cöûa soå ñöôïc caäp nhaät.
fuRedraw moät hay nhieàu côø veõ laïi, coù theå keát hôïp nhieàu côø.
Caùc côø sau ñöôïc söû duïng ñeå laøm maát hieäu löïc vuøng cöûa soå:
RDW_ERASE laøm cho cöûa soå nhaän thoâng ñieäp WM_ERASEBKGND khi cöûa soå ñöôïc veõ laïi. Côø RDW_INVALIDATE cuõng phaûi ñöôïc xaùc ñònh neáu khoâng côø RDW_ERASE khoâng coù taùc duïng.
RDW_FRAME laøm cho baát kyø vuøng naøo cuûa vuøng non-client cuûa cöûa soå maø giao vôùi vuøng caäp nhaät nhaän thoâng ñieäp WM_NCPAINT. Côø RDW_INVALIDATE cuõng phaûi ñöôïc xaùc ñònh neáu khoâng RDW_FRAME khoâng aûnh höôûng. Thoâng ñieäp thöôøng khoâng gôûi trong suoát söï thöïc thi cuûa haøm RedrawWindow tröø khi RDW_UPDATENOW hay RDW_ERASENOW ñöôïc xaùc ñònh.
RDW_INTERNALPAINT laøm cho WM_PAINT ñöôïc gôûi (send) tôùi cöûa soå maø khoâng quan taâm cöûa soå chöùa vuøng hôïp leä hay khoâng.
RDW_INVALIDATE laøm maát hieäu löïc lprcUpdate hay hrgnUpdate (chæ moät trong chuùng coù leõ khoâng NULL). Neáu caû hai NULL, thì toaøn boä cöûa soå bò maát hieäu löïc.
Nhöõng côø sau laøm coù hieäu löïc vuøng cöûa soå:
RDW_NOERASE chaën baát kyø thoâng ñieäp WM_ERASEBKGND naøo saép xaûy ra.
RDW_NOFRAME chaën baát kyø thoâng ñieäp WM_NCPAINT naøo saép xaûy ra. Côø naøy phaûi ñöôïc söû duïng vôùi RDW_VALIDATE vaø ñöôïc söû duïng ñieån hình vôùi RDW_NOCHILDREN. Söï choïn löïa ñeå söû duïng naøy phaûi caån thaän khi noù coù theå laøm cho caùc phaàn cuûa cöûa soå veõ ñuùng.
RDW_NOINTERNALPAINT chaën baát kyø thoâng ñieäp noäi WM_PAINT naøo. Côø naøy khoâng aûnh höôûng WM_PAINT gaây keát quaû töø vuøng hôïp leä.
RDW_VALIDATE laøm hôïp leä lprcUpdate hay hrgnUpdate (chæ moät coù leû khoâng NULL). Neáu caû hai ñeàu NULL, thì toaøn boä cöûa soå ñöôïc hôïp leä. Côø naøy khoâng aûnh höôûng tôùi thoâng ñieäp noäi WM_PAINT.
Nhöõng côø döôùi ñaây ñieàu khieån khi vieäc veõ xaûy ra. Khoâng coù söï veõ naøo ñöôïc thöïc hieän bôûi haøm RedrawWindow tröø khi moät trong caùc maãu naøy ñöôïc xaùc ñònh.
RDW_ERASENOW laøm cho caùc cöûa soå bò taùc duïng (nhö laø ñöôïc xaùc ñònh bôûi côø RDW_ALLCHILDREN vaø RDW_NOCHILDREN) nhaän thoâng ñieäp WM_NCPAINT vaø WM_ERASEBKGND ,Neáu caàn thieát tröôùc luùc haøm traû veà thì WM_PAINT bò trì hoaõn.
RDW_UPDATENOW laøm cho caùc cöûa soå bò taùc duïng (nhö laø ñöôïc xaùc ñònh bôûi côø RDW_ALLCHILDREN vaø RDW_NOCHILDREN) nhaän thoâng ñieäp WM_NCPAINT, WM_ERASEBKGND vaø WM_PAINT. Neáu caàn thieát tröôùc luùc haøm traû veà.
- Maëc ñònh, caùc cöûa soå bò taùc duïng bôûi haøm RedrawWindow phuï thuoäc vieäc cöûa soå coù kieåu WS_CLIPCHILDREN hay khoâng. Nhöõng cöûa soå con cuûa caùc cöûa soå WS_CLIPCHILDREN khoâng bò aûnh höôûng; Tuy nhieân caùc cöûa soå khoâng WS_CLIPCHILDREN ñöôïc laøm coù hieäu löïc moät caùc ñeä quy hay ñöôïc laøm maát hieäu löïc cho ñeán khi moät cöûa soå WS_CLIPCHILDREN ñöôïc baét gaëp. Caùc côø sau ñieàu khieån nhöõng cöûa soå bò aûnh höôûng bôûi haøm RedrawWindow:
RDW_ALLCHILDREN goàm caùc cöûa soå con (neáu co)ù trong hoaït ñoäng veõ
RDW_NOCHILDREN loaïi tröø caùc cöûa soå con (neáu coù) ra khoûi hoaït ñoäng veõ
- Giaù trò traû veà: khaùc 0 neáu thaønh coâng, ngöôïc laïi laø 0.
- Chuù yù: Khi haøm RedrawWindow ñöôïc duøng ñeå laøm maát hieäu löïc vuøng cöûa soå desktop thì cöûa soå desktop khoâng nhaän thoâng ñieäp WM_PAINT. Ñeå veõ laïi desktop moät öùng duïng seõ söû duïng côø RDW_ERASE ñeå sinh ra thoâng ñieäp WM_ERASEBKGND.
11 - Haøm GetViewportOrgEx:
Haøm GetViewportOrgEx laáy toïa ñoä x, y cuûa origin cuûa viewport ñöôïc toå chöùc vôùi moät DC.
- Cuù phaùp:
BOOL GetViewportOrgEx(hdc, lpPoint)
HDC hdc;
POINT FAR* lpPoint;
- Thoâng soá:
hdc xaùc ñònh device context.
lpPoint Points chæ tôùi ñòa chæ moät caáu truùc POINT. Origin cuûa viewport (trong toïa ñoä thieát bò) ñöôïc ñaët trong caáu truùc naøy.
- Giaù trò traû veà: khaùc 0 neáu thaønh coâng, ngöôïc laïi laø 0.
12 - Haøm GetDCOrg:
Haøm GetDCOrg laáy toïa ñoä cuûa origin dòch cuoái cuøng cho DC. Origin naøy xaùc ñònh offset ñöôïc söû duïng bôûi Windows ñeå dòch toïa ñoä thieát bò sang toïa ñoä client cho caùc ñieåm trong moät cöûa soå öùng duïng. Origin dòch cuoái cuøng lieân quan vôùi origin vaät lyù cuûa maøn hình.
- Cuù phaùp:
DWORD GetDCOrg(hdc)
HDC hdc; // handle of device context
- Thoâng soá:
hdc device context maø origin cuûa noù ñöôïc laáy
- Giaù trò traû veà: word thaáp cuûa giaù trò traû veà chöùa toïa ñoä x vaø word cao chöùa toaï ñoä y cuûa origin dòch cuoái cuøng trong heä toaï ñoä thieát bò neáu haøm thaønh coâng.
13 - Haøm GetClientRect:
Haøm GetClientRect toïa ñoä client cuûa vuøng client cuûa cöûa soå. Toïa ñoä client xaùc ñònh goùc traùi-treân vaø phaûi-döôùi cuûa vuøng client. Bôûi vì toïa ñoä client lieân quan ñeán goùc traùi-treân cuûa vuøng client cuûa cöûa soå neân toïa ñoä cuûa goùc traùi-treân laø (0,0).
- Cuù phaùp:
void GetClientRect(hwnd, lprc)
HWND hwnd; // handle of window
RECT FAR* lprc; // address of structure for rectangle
- Thoâng soá:
hwnd Cöûa soå maø toïa ñoä client cuûa noù ñöôïc laáy
lprc chæ tôùi caáu truùc RECT nhaän toïa ñoä client. Giaù trò left vaø top seõ laø 0, right vaø bottom seõ chöùa chieàu roäng vaø chieàu cao cuûa cöûa soå.
- Giaù trò traû veà: khoâng traû veà giaù trò.
14 – Caùc thoâng ñieäp ñeå veõ laïi maøn hình:
Caùc thoâng ñieäp naøy ñöôïc gôûi ñeán cöûa soå ñöôïc cho baèng haøm SendMessage vaø khieán cho öùng duïng quaûn lyù cöûa soå ñoù veõ laïi cöûa soå.
a) Thoâng ñieäp WM_PAINT:
Maët baèng cöûa soå bò thay ñoåi lieân tuïc (bôûi caùc leänh resize, ñoùng môû caùc dialog box…) vì theá neáu khoâng caäp nhaät thì seõ bò bieán daïng neân Windows duøng thoâng ñieäp WM_PAINT ñeå toâ veõ laïi maøn hình.
Coù nhieàu tình huoáng laøm cho Windows phaùt ra thoâng ñieäp WM_PAINT:
- Tröôùc heát laø khi ngöôøi söû duïng chaïy chöông trình
- Sau khi cöûa soå co giaûn hay hoaøn nguyeân sau khi cöûa soå bò che phuû (moät phaàn hay toaøn phaàn) bôûi moät cöûa soå khaùc töùc laø moät phaàn cöûa soå bò che khoâng thaáy baây giôø ñöôïc veõ laïi cho thaáy
- Gôûi ñi moät thoâng ñieäp WM_PAINT baèng caùch laøm maát hieäu löïc vuøng client (invalidating) cuûa noù nhö goïi haøm InValidateRect().
WM_PAINT:
Hdc = (HDC) wParam ; // DC ñeå veõ trong ñoù
Hdc chæ tôùi DC ñeå veõ, neáu laø NULL thì duøng DC coù saün, hdc ñöôïc söû duïng bôûi moät vaøi ñieàu khieån chung ñeå coù theå veõ trong moät DC khaùc hôn laø DC coù saün. Caùc cöûa soå khaùc coù theå phôùt lôø thoâng soá naøy.
Trò traû veà: moät öùng duïng traû veà 0 neáu noù xöû lyù thoâng ñieäp naøy.
b) Thoâng ñieäp WM_NCPAINT:
Moät öùng duïng gôûi thoâng ñieäp naøy tôùi moät cöûa soå khi khung (frame) cuûa noù phaûi ñöôïc veõ laïi.
Khung cöûa soå laø vuøng khoâng phaûi client area.
WM_NCPAINT:
Hrgn = (HRGN) wParam ; // handle cuûa update region
Tham soá:
Hrgn laø giaù trò cuûa wParam chæ tôùi update region ñöôïc xeùn tôùi frame cöûa soå, khi wParam = 1 thì toaøn boä frame cöûa soå caàn ñöôïc caäp nhaät.
Giaù trò traû veà: moät öùng duïng traû veà giaù trò 0 neáu noù xöû lyù thoâng ñieäp naøy.
Ghi chuù: clipping region cuûa cöûa soå luoân luoân laø hình chöõ nhaät ngay caû khi hình daïng cuûa frame thay ñoåi.
IV – Giôùi thieäu moät soá caáu truùc döõ lieäu coù lieân quan:
Caùc caáu truùc döõ lieäu naøy laø caáu truùc chuaån cuûa Windows 3.1, ñöôïc ñònh nghóa trong file WINDOWS.H
1 - Caáu truùc TEXTMETRIC:
Caáu truùc TEXTMETRIC chöùa thoâng tin caên baûn veà font vaät lyù. Taát caû caùc kích thöôùc ñöôïc ñöa ra trong caùc ñôn vò luaän lyù töùc laø chuùng phuï thuoäc vaøo cheá ñoä aùnh xaï hieän haønh ngöõ caûnh maøn hình.
Noäi dung yù nghóa cuûa caùc döõ lieäu trong caáu truùc naøy ñaõ trình baøy trong chöông 4: Keát xuaát vaên baûn.
2 – Caáu truùc POINT:
- Duøng ñeå ñònh nghóa toïa ñoä x, y cuûa moät ñieåm.
- Cuù phaùp:
typedef struct tagPOINT
{
LONG x;
LONG y;
}
3 – Caáu truùc STRUCT:
- Ñònh nghóa toïa ñoä caùc goùc upper-left vaø lower-right cuûa moät hình chöõ nhaät
- Cuù phaùp:
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
4 – Caáu truùc PAINTSTRUCT:
- Duøng chöùa thoâng tin duøng ñeå toâ veõ moät client area thuoäc cöûa soå.
- Cuù phaùp:
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BYTE fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
- Tham soá:
hdc handle cuûa DC caàn veõ
fErase cho bieát background coù veõ laïi hay khoâng, neáu khaùc 0 thì toâ veõ coøn neáu ngöôïc laïi thì khoâng veõ.
rcPaint goùc upper-left vaø lower-right cuûa hình chöõ nhaät ñöôïc veõ
fRestore daønh rieâng cho söû duïng noäi taïi cuûa Windows.
fIncUpdate daønh rieâng cho söû duïng noäi taïi cuûa Windows.
RgbResersed[16] khoái kyù öùc daønh rieâng cho söû duïng noäi taïi cuûa Windows.
5 – Caáu truùc EVENTMSG:
- Chöùa thoâng tin töø haøng öùng duïng cuûa Windows, ñöôïc söû duïng ñeå löu tröõ thoâng tin thoâng ñieäp cho haøm callback JornalPlaybackProc.
- Cuù phaùp:
typedef struct tagEVENTMSG
{
UINT message;
UINT paramL;
UINT paramH;
DWORD time;
} EVENTMSG;
- Thoâng soá:
message thoâng ñieäp
paramL thoâng tin theâm vaøo veà thoâng ñieäp. Nghóa chính xaùc phuï thuoäc vaøo giaù trò thoâng ñieäp.
paramH thoâng tin theâm vaøo veà thoâng ñieäp. Nghóa chính xaùc phuï thuoäc vaøo giaù trò thoâng ñieäp.
time thôøi ñieåm maø thoâng ñieäp ñöôïc post.
6 – Caáu truùc MSG:
- Chöùa thoâng tin töø haøng öùng duïng cöûa soå.
- Cuù phaùp:
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
- Thoâng soá:
hwnd cöûa soå nhaän thoâng ñieäp
message oá thoâng ñieäp
wParam thoâng tin theâm vaøo veà thoâng ñieäp. Nghóa chính xaùc phuï thuoäc vaøo giaù trò thoâng ñieäp.
lParam thoâng tin theâm vaøo veà thoâng ñieäp. Nghóa chính xaùc phuï thuoäc vaøo giaù trò thoâng ñieäp.
time thôøi ñieåm thoâng ñieäp ñöôïc post.
pt vò trí cursor ôû toïa ñoä maøn hình khi thoâng ñieäp ñöôïc post.
7 - Caáu truùc SIZE:
- Chöùa viewport extents, window extents, text extents, bitmap dimensions, vaø aspect-ratio filter cho moät vaøi haøm môû roäng
- Cuù phaùp:
typedef struct tagSIZE
{
int cx;
int cy;
} SIZE;
- Thoâng soá:
cx x-extent khi haøm traû veà
cy y-extent khi haøm traû veà
8 - Caáu truùc MOUSEHOOKSTRUCT:
- Caáu truùc MOUSEHOOKSTRUCT chöùa thoâng tin veà moät söï kieän chuoät
- Cuù phaùp:
typedef struct tagMOUSEHOOKSTRUCT
{
POINT pt;
HWND hwnd;
UINT wHitTestCode;
DWORD dwExtraInfo;
} MOUSEHOOKSTRUCT;
- Thoâng soá:
pt moät ñieåm coù caáu truùc POINT chöùa toïa ñoä x,y cuûa mouse cursor trong heä toïa ñoä maøn hình
hwnd cöûa soå seõ nhaän thoâng ñieäp chuoät töông öùng vôùi söï kieän mouse
wHitTestCode maõ hit-test traû veà
dwExtraInfo thoâng tin theâm vaøo ñöôïc toå chöùc vôùi söï kieän mouse. Moät öùng duïng coù theå thieát laäp thoâng tin theâm vaøo naøy baèng caùch goïi haøm söï kieän phaàn cöùng vaø laáy noù baèng caùch goïi haøm GetMessageExtraInfo .
Keát quaû vaø höôùng phaùt trieån
Chöông trình GETTEXT ñaõ böôùc ñaàu ñaùp öùng ñöôïc yeâu caàu cuûa ñeà taøi ñaët ra: Nhaän daïng ñöôïc caùc töø hieån thò treân maøn hình.
Tuy nhieân, do kyõ thuaät override chæ môùi thöïc hieän ñöôïc trong moâi tröôøng Windows 16 bits, neân chöông trình naøy chæ chaïy ñöôïc treân moâi tröôøng Windows 16bits. Trong moâi tröôøng Windows 9x, laø moâi tröôøng lai taïp giöõa 16bits vaø 32bits, neân chöông trình chæ nhaän daïng ñöôïc khi doøng vaên baûn ñöôïc xuaát bôûi caùc haøm keát xuaát vaên baûn cuûa moâi tröôøng 16bits (nhö TextOut, ExtTextOut), coøn ñoái vôùi vaên baûn ñöôïc keát xuaát bôûi caùc haøm cuûa moâi tröôøng 32bits (nhö TextOutA, ExtTextOutA - ñöôïc duøng ñeå keát xuaát vaên baûn trong caùc phaàm meàm 32bits nhö Microsoft Office 97) thì chöông trình khoâng theå nhaän daïng ñöôïc. Duø vaäy ñieàu maø ñeà taøi ñaõ ñaït ñöôïc laø ñöa ra ñöôïc moät giaûi thuaät khung söôøn mang tính khaû thi, coù theå phaùt trieån hoaøn chænh trong töông lai.
Do vaäy, ñeå nhaän daïng ñöôïc taát caû caùc töø xuaát hieän treân maøn hình Windows thì phaûi override ñöôïc caùc haøm cuûa Windows 32bits. Vieäc naøy thöïc söï laø moät vaán ñeà lôùn, vaø caàn phaûi hieåu saâu saéc veà Windows, vì Windows coù cheá ñoä baûo veä boä nhôù raát chaët cheõ, neân khoâng theå ghi xoaù vaøo haøm API nhö caùch maø chöông trình ñaõ laøm, do ñoù caàn phaûi coù giaûi thuaät khaùc.
Ngoaøi ra vieäc laáy döõ lieäu baèng caùch override chæ laø moät höôùng ñeå giaûi quyeát vaán ñeà, ta cuõng coù theå thöïc hieän baèng caùch khaùc nhö duøng caùc haøm laáy text maø Windows coù hoã trôï, nhöng coù theå vaán ñeà seõ phöùc taïp hôn.
._.
Các file đính kèm theo tài liệu này:
- LV0875.doc