Tải bản đầy đủ (.doc) (93 trang)

Đồ án nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (503.31 KB, 93 trang )

M C L CỤ Ụ
L I M UỜ Ở ĐẦ 3
CH NG 1: TÌM HI U V L P TRÌNH WINDOWSƯƠ Ể Ề Ậ 4
I. Khái quát v l p trình trong Windowsề ậ 5
II. Thông đi p và x lý thông đi pệ ử ệ 7
III. Giao di n thi t b đ h a GDIệ ế ị ồ ọ 11
IV. C a s trong Windowsử ổ 15
V. Ch ng trình Windows ti p nh n thông đi p chu tươ ế ậ ệ ộ 22
CH NG 2: TÌM HI U V HOOKƯƠ Ể Ề 26
1 - Chu i hookỗ 27
2 - Th t c hookủ ụ 27
3 - Các lo i hookạ 28
4 - S d ng hookử ụ 30
5 - Hook trong Windows 3.x 31
6 - Gi i thi u m t s hàm liên quan đ n hookớ ệ ộ ố ế 33
CH NG 3: K THU T OVERRIDE HÀM APIƯƠ Ỹ Ậ 36
I. Khái quát v k thu t overrideề ỹ ậ 37
II. Lý do s d ng k thu t override trong l p trình Windowsử ụ ỹ ậ ậ 37
III. C ch ho t đ ng và qu n lý b nh trên Windows 16bitsơ ế ạ ộ ả ộ ớ 38
IV. C ch ho t đ ng và qu n lý b nh trên Windows 32bitsơ ế ạ ộ ả ộ ớ 41
V. Hi n th c k thu t override trên Windows 16bitsệ ự ỹ ậ 45
VI. M t s hàm đ c s d ng trong k thu t overrideộ ố ượ ử ụ ỹ ậ 50
CH NG 4: K T XU T V N B N TRONG WINDOWSƯƠ Ế Ấ Ă Ả 54
I. K t xu t v n b n trong Windowsế ấ ă ả 55
II. Các hàm c n b n đ k t xu t v n b nă ả ể ế ấ ă ả 55
CH NG 5: PHÂN TÍCH VÀ THI T K CH NG TRÌNHƯƠ Ế Ế ƯƠ 66
I. Phân tích v n đấ ề 67
II. Thi t k ch ng trìnhế ế ươ 68
III. Gi i thi u m t s hàm có liên quanớ ệ ộ ố 78
IV. Gi i thi u m t s c u trúc d li u có liên quanớ ệ ộ ố ấ ữ ệ 92
K T QU VÀ H NG PHÁT TRI NẾ Ả ƯỚ Ể 97


L i M uờ ở Đầ
gày nay, h u nh m i công vi c hàng ngày liên quan đ n cu c s ng c a chúng ta đ uầ ư ọ ệ ế ộ ố ủ ề
di n ra trên máy tính. T vi c so n th o v n b n, g i nh n thông tin đ nễ ừ ệ ạ ả ă ả ở ậ ế
vi c tra c u, truy c p thông tin t h th ng m ng máy tính toàn c u Internet đ iệ ứ ậ ừ ệ ố ạ ầ ố
v i ng i s d ng là công vi c th ng ngày và r t ph bi n. ớ ườ ử ụ ệ ườ ấ ổ ế
T đó, s phát sinh v n đ là ng i s d ng s c n tìm hi u ý ngh a c a m từ ẽ ấ ề ườ ử ụ ẽ ầ ể ĩ ủ ộ
t , m t câu ho c c n ph i d ch m t đo n v n b n, m t file d li u nào đó ra ti ngừ ộ ặ ầ ả ị ộ ạ ă ả ộ ữ ệ ế
Vi t và ng c l i. ây là m t nhu c u c n thi t và h u nh x y ra th ng xuyên đ iệ ượ ạ Đ ộ ầ ầ ế ầ ư ả ườ ố
v i nhi u ng i, do đó nh n d ng t đ c bi t là nh n d ng t trên màn hình trongớ ề ườ ậ ạ ừ ặ ệ ậ ạ ừ
môi tr ng Windows là vi c làm c n thi t và có ý ngh a th c t .ườ ệ ầ ế ĩ ự ế
K t qu c a vi c nh n d ng t s đ c dùng đ xây d ng nên các ng d ngế ả ủ ệ ậ ạ ừ ẽ ượ ể ự ứ ụ
khác ch ng h n nh các t đi n đ c tra c u theo ki u t ng tác tr c ti p s r tẳ ạ ư ừ ể ượ ứ ể ươ ự ế ẽ ấ
thu n ti n cho ng i s d ng b i vì theo cách này thì cho dù đang trong b t kậ ệ ườ ử ụ ở ở ấ ỳ
ng d ng nào khi c n tra c u thì thao tác tr c ti p ngay trên ng d ng đang dùng t cứ ụ ầ ứ ự ế ứ ụ ứ
là ch c n click chu t vào đó ch không c n ph i m t đi n r i tra c u t đó theoỉ ầ ộ ứ ầ ả ở ừ ể ồ ứ ừ
ki u c đi n.ể ổ ể
Vì th , trong th i gian làm Lu n Án T t nghi p đ c s h ng d n c a th yế ờ ậ ố ệ ượ ự ướ ẫ ủ ầ
Lê T n Hùng nhóm sinh viên chúng tôi th c hi n đ tài: “ Nh n d ng t d i cursorấ ự ệ ề ậ ạ ừ ướ
mouse trên deskop Windows. Vi t ch ng trình nh n d ng t này ”. Trong giaiế ươ ậ ạ ừ
đo n đ u c a Lu n Án T t Nghi p chúng tôi đã nghiên c u đ c m t s v n đ quanạ ầ ủ ậ ố ệ ứ ượ ộ ố ấ ề
tr ng và c n b n có ý ngh a trong vi c th c hi n yêu c u đã đ t ra c a đ tài. tài nàyọ ă ả ĩ ệ ự ệ ầ ặ ủ ề Đề
ch t p trung nh n d ng t d ng text trên desktop c a môi tr ng Windows r iỉ ậ ậ ạ ừ ở ạ ủ ườ ồ
xu t k t qu ra.ấ ế ả
Trong th i gian làm Lu n Án T t Nghi p nhóm sinh viên chúng tôi đã ti n hànhờ ậ ố ệ ế
nghiên c u c ch ho t đ ng và qu n lý c a h đi u hành Windows. Nghiên c u vứ ơ ế ạ ộ ả ủ ệ ề ứ ề
ph ng th c l p trình trong môi tr ng Windows và các ph ng ti n mà Windowsươ ứ ậ ườ ươ ệ
h tr khi l p trình. Tham kh o và nghiên c u k thu t override các hàm giao ti pỗ ợ ậ ả ứ ỹ ậ ế
c a Windows ch đ 16 bit và 32 bit. Nghiên c u cách x lý các thông đi p trongủ ở ế ộ ứ ử ệ
Windows và tìm hi u v cách k t xu t v n b n, v ch đ ánh x , v n đ t aể ề ế ấ ă ả ề ế ộ ạ ấ ề ọ
đ . . . và cách x lý v n b n. Trên c s đó b c đ u chúng tôi đã xây d ng xong m tộ ử ă ả ơ ở ướ ầ ự ộ

ng d ng có kh n ng nh n d ng đ c t trên n n Windows 16 bit đ c vi tứ ụ ả ă ậ ạ ượ ừ ề ượ ế
b ng ngôn ng Visual C++ version 1.5 và h ng phát tri n trong th i gian t i làằ ữ ướ ể ờ ớ
hi n th c nó trên n n Win32.ệ ự ề
Báo cáo c a chúng tôi s l n l t đi m qua nh ng n i dung mà chúng tôi đã nghiênủ ẽ ầ ượ ể ữ ộ
c u và tìm hi u đ c trong th i gian qua. Sau đó là ph n gi i thi u chi ti t vứ ể ượ ờ ầ ớ ệ ế ề
ch ng trình t khâu phân tích-thi t k cho đ n ph n ch ng trình ngu n và cu iươ ừ ế ế ế ầ ươ ồ ố
cùng s là nêu nh ng v n đ còn t n t i và h ng phát tri n trong t ng lai.ẽ ữ ấ ề ồ ạ ướ ể ươ
Ch ng 1:ươ
TÌM HIỂU VỀ LẬP TRÌNH WINDOWS
TÌM HIỂU VỀ LẬP TRÌNH WINDOWS
I - KHÁI QUÁT V L P TRÌNH TRONG WINDOWS:Ề Ậ
1 - Khái quát v l p trình trong Windows:ề ậ
Môi tr ng l p trình Windows v c b n là d a trên b hàm API (Applicationườ ậ ề ơ ả ự ộ
Programmer Interface), nó có ch c n ng nh các ng t trong b ng vector ng t c aứ ă ư ắ ả ắ ủ
DOS, nh ng nó thân thi n h n ch cách g i hàm API gi ng h t cách g i hàm c aư ệ ơ ở ỗ ọ ố ệ ọ ủ
ngôn ng c p cao, m i hàm có m t tên g i h n hoi, và tên g i th ng đ c đ t r tữ ấ ỗ ộ ọ ẳ ọ ườ ượ ặ ấ
phù h p v i công d ng c a hàm (m c dù có h i dài dòng) t đó t o kh n ng g i nhợ ớ ụ ủ ặ ơ ừ ạ ả ă ợ ớ
cao. V i Windows, ng i l p trình không còn ph i l p trình theo ki u assemblyớ ườ ậ ả ậ ể
n a mà l p trình theo ki u ngôn ng c p cao, m i ho t đ ng trong máy m cữ ậ ể ữ ấ ọ ạ ộ ở ứ
th p t hàm API tr xu ng thu c ph m vi c a Windows, và Windows khôngấ ừ ở ố ộ ạ ủ
khuy n khích vi c các ng d ng can thi p vào l nh v c này. Bù l i, b ng các hàmế ệ ứ ụ ệ ĩ ự ạ ằ
API, nó h tr r t hi u qu cho ng i l p trình, giúp khai thác kh n ng c a thi tỗ ợ ấ ệ ả ườ ậ ả ă ủ ế
b tri t đ , d dàng và ti n l i h n bao gi h t. Có th nói Windows đã m ra choị ệ ể ễ ệ ợ ơ ờ ế ể ở
ng i l p trình không gian r ng l n đ phát tri n ng d ng, và h n ch khôngườ ậ ộ ớ ể ể ứ ụ ạ ế
gian phát tri n h th ng. i u này d n đ n h qu là các ng d ng đ c t o ra h tể ệ ố Đ ề ẫ ế ệ ả ứ ụ ượ ạ ế
s c d dàng, và quan tr ng là h th ng ch y n đ nh h n, không b treo do l i c aứ ễ ọ ệ ố ạ ổ ị ơ ị ỗ ủ
ng d ng, không th xâm nh p, nh ng s r t khó kh n n u ng i l p trìnhứ ụ ể ậ ư ẽ ấ ă ế ườ ậ
mu n tr c ti p đi u khi n ho t đ ng trong máy và phát tri n v l p trình h th ng.ố ự ế ề ể ạ ộ ể ề ậ ệ ố
- Tìm hi u hàm Windows APIể : Windows là m t h đi u hành đa nhi mộ ệ ề ệ
(multitasking) mà qua đó các ng d ng trong môi tr ng Windows s giao ti pứ ụ ở ườ ẽ ế

v i user thông qua m t hay nhi u giao di n. truy c p các giao di n này thì cácớ ộ ề ệ Để ậ ệ
ng d ng đ c xây d ng trên môi tr ng Windows s s d ng t p các hàm đ c g iứ ụ ượ ự ườ ẽ ử ụ ậ ượ ọ
là giao di n ch ng trình ng d ng API (Application Program Interface).ệ ươ ứ ụ
Ch ng trình c a ng i s d ng có th g i t i các hàm API đ truy c p t i m i tàiươ ủ ườ ử ụ ể ọ ớ ể ậ ớ ọ
nguyên c a Windows. GDI là m t b ph n c a API, giao di n thi t b đ h a GDIủ ộ ộ ậ ủ ệ ế ị ồ ọ
(Graphic Device Interface) có nhi m v duy trì s đ c l p c a Windows đ i v iệ ụ ự ộ ậ ủ ố ớ
các thi t b đ h a hay còn g i là kh n ng đ c l p thi t b (device independent)ế ị ồ ọ ọ ả ă ộ ậ ế ị
t c là cho phép Windows làm vi c v i nhi u ki u thi t b đ h a khác nhau.ứ ệ ớ ề ể ế ị ồ ọ
2 - Th vi n liên k t ng DLL (Dynamic Link Library):ư ệ ế độ
Th vi n liên k t đ ng là các t p tin đ c Windows l u d i d ng nh phânư ệ ế ộ ậ ượ ư ướ ạ ị
ch a các hàm mà m i ng d ng trên Windows đ u có th s d ng. Nét đ c tr ng c aứ ọ ứ ụ ề ể ử ụ ặ ư ủ
DLL là nó có th đ c s d ng b i nhi u ng d ng t i cùng m t th i đi m hay nóiể ượ ử ụ ở ề ứ ụ ạ ộ ờ ể
cách khác th vi n liên k t đ ng có th cùng m t lúc đ c g i b i nhi u ch ng trình.ư ệ ế ộ ể ộ ượ ọ ở ề ươ
DLL là m t d li u chia s đ c (shared data).ộ ữ ệ ẻ ượ
Có 3 lo i DLL khác nhau:ạ
- Th vi n liên k t đ ng API: thu c h th ng Windows, khi cài h đi u hànhư ệ ế ộ ộ ệ ố ệ ề
thì nó đã có s n. Chúng đ c n p khi Windows kh i đ ng.ẵ ượ ạ ở ộ
- Th vi n liên k t đ ng third party: do các công ty khác t o ra trên môi tr ngư ệ ế ộ ạ ườ
Windows, h tr thêm công tác l p trình trong Windows.ỗ ợ ậ
- Th vi n liên k t đ ng do chúng ta t o ra.ư ệ ế ộ ạ
Windows s d ng c u trúc th vi n liên k t đ ng DLL (Dynamic Linkử ụ ấ ư ệ ế ộ
Library) nh m m c đích không sao chép m t kh i l ng l n các mã vào trongằ ụ ộ ố ượ ớ
ch ng trình nh các th vi n thông th ng. Nh c u trúc đ ng c a DLL nênươ ư ở ư ệ ườ ờ ấ ộ ủ
m i ch ng trình đ u có th truy c p th vi n trong th i gian th c thi. Các hàmọ ươ ề ể ậ ư ệ ờ ự
API đ c Windows gi d i d ng h n h p trong m t s DLL. Trong quá trìnhượ ữ ướ ạ ỗ ợ ộ ố
d ch khi g p l nh g i hàm API t ch ng trình ng d ng thì ch ng trình d chị ặ ệ ọ ừ ươ ứ ụ ươ ị
không thêm mã này vào module th c hi n mà ch thêm các l nh liên k t (ch a tên c aự ệ ỉ ệ ế ứ ủ
DLL bên trong có hàm c n n p) và tên hàm đó. Khi th c thi ch ng trình thì hàm APIầ ạ ự ươ
th c s m i đ c n p vào b nh đ th c hi n.ự ự ớ ượ ạ ộ ớ ể ự ệ
Cùng v i s phát tri n c a Windows là s phát tri n c a l p trình h ng đ iớ ự ể ủ ự ể ủ ậ ướ ố

t ng, và đ h tr cho vi c l p trình h ng đ i t ng, Microsoft đã cung c p choượ ể ỗ ợ ệ ậ ướ ố ượ ấ
ng i l p trình m t b th vi n các l p c b n đ phát tri n các ng d ng h ngườ ậ ộ ộ ư ệ ớ ơ ả ể ể ứ ụ ướ
đ i t ng g i là MFC (Microsoft Foundation Classes), n i dung c a nó bao g mố ượ ọ ộ ủ ồ
thông tin v các l p c b n đ c chu n hóa nh l p application; document; view;ề ớ ơ ả ượ ẩ ư ớ
OLE; c a s ; nút b m; text; v.v…, trong các l p này m i th liên quan đ n nó (baoử ổ ấ ớ ọ ứ ế
g m d li u và các ch ng trình x lý c a nó) đ u đ c làm hoàn ch nh, ng i l pồ ữ ệ ươ ử ủ ề ượ ỉ ườ ậ
trình ch vi c l y ra s d ng, ho c có th thêm b t m t ít tính n ng đ c tr ng choỉ ệ ấ ử ụ ặ ể ớ ộ ă ặ ư
đ i t ng c a mình. M c tiêu chính c a MFC là h th ng hóa các hàm API, cungố ượ ủ ụ ủ ệ ố
c p m t th th c g i g n các hàm API, cung c p m t “khung làm vi c”ấ ộ ể ứ ọ ọ ấ ộ ệ
(framework) c c m nh đ ng i l p trình không c n ph i quan tâm đ n nh ngự ạ ể ườ ậ ầ ả ế ữ
đo n ch ng trình thu c v “th t c” mà ch c n quan tâm đ n ph n c t lõi đ đ tạ ươ ộ ề ủ ụ ỉ ầ ế ầ ố ể ạ
đ c m c đích.ượ ụ
II - THÔNG I P VÀ X LÝ THÔNG I P:Đ Ệ Ử Đ Ệ
1 - Khái ni m:ệ
L p trình trên môi tr ng Windows khác v i l p trình các môi tr ng khác ậ ườ ớ ậ ở ườ ở
đi m là l p trình trên Windows luôn luôn g n li n v i nh ng thông đi p. M i ho tể ậ ắ ề ớ ữ ệ ọ ạ
đ ng x y ra trên m t ch ng trình Windows đ u thông qua các thông đi p. Thôngộ ả ộ ươ ề ệ
đi p s đ c h th ng báo cho các ng d ng bi t các tác đ ng t bên ngoài vào hệ ẽ ượ ệ ố ứ ụ ế ộ ừ ệ
th ng Windows. M t c a s có th g i đi m t thông đi p cho m t c a s khác vàố ộ ử ổ ể ở ộ ệ ộ ử ổ
các c a s đáp ng l i thông đi p b ng cách g i đi m t thông đi p khác cho m t c aử ổ ứ ạ ệ ằ ở ộ ệ ộ ử
s khác.ổ
Trong Windows có 3 lo i thông đi p c b n:ạ ệ ơ ả
- Nh ng thông đi p t ng quát: có mã nh n di n mang ti n t WM_ đ c coi làữ ệ ổ ậ ệ ề ố ượ
ph n l n trong ng d ng và Windows đã cung c p các hàm đ gi i quy t.ầ ớ ứ ụ ấ ể ả ế
- Nh ng control notification: đây là nh ng thông đi p WM_COMMAND đ cữ ữ ệ ượ
chuy n t c a s con t i c a s b m .ể ừ ử ổ ớ ử ổ ố ẹ
- Nh ng nút l nh: là thông đi p WM_COMMAND phát đi t trình đ n, t các nútữ ệ ệ ừ ơ ừ
đi u khi n. ây là lo i thông đi p yêu c u ng d ng ph i th c hi n m t công vi cề ể Đ ạ ệ ầ ứ ụ ả ự ệ ộ ệ
gì đó.
2 - G i i các thông i p:ở đ đ ệ

Windows cho phép ng d ng g i đi nh ng thông đi p cho mình, cho các ngứ ụ ở ữ ệ ứ
d ng khác ho c cho h th ng.ụ ặ ệ ố
Có 3 hàm Windows API đ g i thông đi p đi:ể ở ệ
a) Hàm SendMessage:
Cú pháp:
LRESULT SendMessage(hwnd, uMsg, wParam, lParam)
HWND hwnd; // handle c a c a s nh n (đích)ủ ử ổ ậ
UINT uMsg; // thông đi p đ g iệ ể ở
WPARAM wParam; // thông s thông đi p đ u tiênố ệ ầ
LPARAM lParam; // thông s thông đi p th haiố ệ ứ
- Hàm SendMessage g i thông đi p t i m t hay nhi u c a s . Hàm g i thở ệ ớ ộ ề ử ổ ọ ủ
t c c a s cho c a s và không tr v cho đ n lúc th t c c a s đã x lý thôngụ ử ổ ử ổ ở ề ế ủ ụ ử ổ ử
đi p.ệ
- Giá tr tr v : cho bi t k t qu x lý thông đi p và ph thu c vào thông đi pị ả ề ế ế ả ử ệ ụ ộ ệ
đ c g i.ượ ở
b) Hàm PostMessage:
- Cú pháp:
BOOL PostMessage(hwnd, uMsg, wParam, lParam)
HWND hwnd; // handle c a c a s đíchủ ủ ổ
UINT uMsg; // thông đi p g iệ ở
WPARAM wParam; // thông s thông đi p đ u tiênố ệ ầ
LPARAM lParam; // thông s thông đi p th haiố ệ ứ
- Hàm PostMessage g i (đ t) m t thông đi p vào trong hàng thông đi p c a sở ặ ộ ệ ệ ử ổ
và r i tr v mà không đ i c a s t ng ng x lý thông đi p. Nh ng thông đi pồ ở ề ợ ử ổ ươ ứ ử ệ ữ ệ
trong m t hàng thông đi p đ c l y b ng cách g i hàm SetMessage hayộ ệ ượ ấ ằ ọ
PeekMessage.
- Giá tr tr v : tr v khác 0 n u thành công, ng c l i 0.ị ả ề ả ề ế ượ ạ
c) Hàm SendDlgItemMessage:
- Cú pháp:
LRESULT

SendDlgItemMessage(hwndDlg,idDlgItem,uMsg,wParam,lParam)
HWND hwndDlg; // handle c a h p h i tho iủ ộ ộ ạ
int idDlgItem; // mã nh n di n ô đi u khi n s nh n thông đi pậ ệ ề ể ẽ ậ ệ
UINT uMsg; // thông đi p g i điệ ở
WPARAM wParam; // thông s thông đi p đ u tiên ố ệ ầ
LPARAM lParam; // thông s thông đi p th haiố ệ ứ
- Hàm SendDlgItemMessage g i m t thông đi p t i m t đi u khi n trongở ộ ệ ớ ộ ề ể
h p h i tho i.ộ ộ ạ
- Giá tr tr v : cho bi t k t qu x lý thông đi p và ph thu c vào thông đi pị ả ề ế ế ả ử ệ ụ ộ ệ
đ c g i.ượ ở
3 - Vòng l p thông i p:ặ đ ệ
M t thread ho c m t process đ y m t thông đi p ra kh i hàng đ i b ng cáchộ ặ ộ ẩ ộ ệ ỏ ợ ằ
dùng vòng l p thông đi p. Vòng loop chính c a m t ng d ng đ t t i cu i hàmặ ệ ủ ộ ứ ụ ặ ạ ố
WinMain() c a ng d ng đó. Vòng l p thông đi p có d ng nh sau:ủ ứ ụ ặ ệ ạ ư
while GetMessage(&msg,NULL,0,0)
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sau đây là S đ dòng thông đi p:ơ ồ ệ
Nó mô t đ n gi n hóa quá trình x lý thông đi p. Thông đi p có th b t ngu nả ơ ả ử ệ ệ ể ắ ồ
t nhi u cách khác nhau, s đ sau đây s gi i thích chi ti t h n v vòng l p thôngừ ề ơ ồ ẽ ả ế ơ ề ặ
đi p và ch ra cách thông đi p đ c đ t vào hàng đ i nh th nào:ệ ỉ ệ ượ ặ ợ ư ế
Thread1 Message Queue Thread2 Message Queue Thread3 Message Queue
System Dispatcher
Hardware Event Occur
System Message Queue
GetMessage()
TranslateMessage()
Dispatch Message()
GetMessage()

TranslateMessage()
Dispatch Message()
GetMessage()
TranslateMessage()
Dispatch Message()
WndProc()
WndProc() WndProc()
DefWndProc()
DefWndProc() DefWndProc()
Thread1 Hook Thread2 Hook Thread3 Hook
System Dispatcher
Thông đi p không ch phát xu t t s ki n ph n c ng, c ng có th có thôngệ ỉ ấ ừ ự ệ ầ ứ ũ ể
đi p c a ch ng trình phát xu t t m t ch ng trình đang ch y. Các threads có thệ ủ ươ ấ ừ ộ ươ ạ ể
g i d li u tr v sau và v tr c b ng cách g i thông đi p. Thông đi p có th g iở ữ ệ ở ề ề ướ ằ ở ệ ệ ể ở
vào hàng đ i b ng hàm PostMessage() , ho c chúng có th đ c g i tr c ti p choợ ằ ặ ể ượ ở ự ế
vòng l p thông đi p đ x lý ngay l p t c b ng hàm SendMessage().ặ ệ ể ử ậ ứ ằ
4 - X lý thông i p:ử đ ệ
Vi c x lý thông đi p là y u t chính làm cho các ng d ng Windows v n hànhệ ử ệ ế ố ứ ụ ậ
đ c. H th ng và các ng d ng khác sinh ra các thông đi p cho m i s ki n xu tượ ệ ố ứ ụ ệ ọ ự ệ ấ
hi n trong h th ng thông đi p c a Windows s cho phép Windows ch y đaệ ệ ố ệ ủ ẽ ạ
nhi m trong m t th i đi m. Windows 95 và Windows NT m r ng kh n ng c aệ ộ ờ ể ở ộ ả ă ủ
version Windows tr c b ng vi c c p phát cho m i dòng x lý (thread) hay m iướ ằ ệ ấ ỗ ử ỗ
ti n trình (proccess) m t hàng đ i thông đi p riêng. Trong version Windows c thìế ộ ợ ệ ũ
t t c ng d ng đ u dùng chung m t hàng đ i thông đi p, vì th đ các ng d ngấ ả ứ ụ ề ộ ợ ệ ế ể ứ ụ
khác x lý thông đi p, ng d ng ph i tr quy n đi u khi n v cho Windows m iử ệ ứ ụ ả ả ề ề ể ề ỗ
khi nó có th . V i Windows 95 và Windows NT, đi u này không còn n a.ể ớ ề ữ
Windows sinh ra thông đi p cho m i s ki n ph n c ng, ví d nh ng iệ ọ ự ệ ầ ứ ụ ư ườ
dùng nh n m t phím ho c di chuy n chu t. Nó g i thông đi p đ n hàng đ i thôngấ ộ ặ ể ộ ở ệ ế ợ
đi p c a thread thích h p, n u thông đi p đ c dành cho nhi u thread thì nó c ngệ ủ ợ ế ệ ượ ề ũ
đ c đ a vào các hàng đ i c a các thread đó.ượ ư ợ ủ

M t thông đi p trên th c t là m t c u trúc d li u nh sau:ộ ệ ự ế ộ ấ ữ ệ ư
typedef struct tagMSG {
Hardware Events
Message Sent
From Other Threads
System Dispatcher
System Message Queue
Thread Message Queue
WndProc()
Message Loop
PostMessage()
TranslateMessage()
SentMessage()
SentMessage()
(To Another Thread)
Other threads
PostMessage()
Other threads
PostMessage()
HWND hwd; // handle c a s ử ổ
UINT message; //s ch đ nh lo i message ố ỉ ị ạ
WPARAM wParam; //đ c chuy n cho WndProc() ượ ể
LPARAM wParam; //đ c chuy n cho WndProc() ượ ể
DWORD time; //s mili giây t lúc b t đ uố ừ ắ ầ
POINT pt; //c u trúc đi m POINTấ ể
}
III - GIAO DI N THI T B H A GDIỆ Ế Ị ĐỒ Ọ
(GRAPHIC DEVICE INTERFACE):
1 - Khái ni m:ệ
Windows là m t h đi u hành đa nhi m (multitasking) trong đó các ng d ngộ ệ ề ệ ứ ụ

giao ti p v i user thông qua m t hay nhi u giao di n. truy xu t các giao di nế ớ ộ ề ệ Để ấ ệ
thì ch ng trình ng d ng ph i s d ng các hàm Giao di n ch ng trình ngươ ứ ụ ả ử ụ ệ ươ ứ
d ng. API là t p các l nh mà m t ng d ng s d ng đ yêu c u và ti n hành các d chụ ậ ệ ộ ứ ụ ử ụ ể ầ ế ị
v c p th p đ c thi hành b i Windows.ụ ấ ấ ượ ở
Giao di n thi t b đ h a GDI (Graphic Device Interface) là m t ph n c aệ ế ị ồ ọ ộ ầ ủ
API có nhi m v duy trì s đ c l p c a Windows đ i v i các thi t b đ h a (choệ ụ ự ộ ậ ủ ố ớ ế ị ồ ọ
phép Windows làm vi c v i nhi u thi t b đ h a khác nhau). Windows GDI là m tệ ớ ề ế ị ồ ọ ộ
th vi n bao g m m t s hàm giúp k t xu t đ h a (graphic output) lên màn hình,ư ệ ồ ộ ố ế ấ ồ ọ
máy in…GDI s t o ra: đi m, đ ng k , hình d ng (shape: ch nh t, tròn…), chẽ ạ ể ườ ẻ ạ ữ ậ ữ
v n b n.ă ả
2 - Device Context:
Ng c nh thi t b DC (Device Context) là m t ph n quan tr ng c a GDIữ ả ế ị ộ ầ ọ ủ
Windows. M t DC là m t c u trúc d li u dài kho ng 800 bytes đ c Windows duyộ ộ ấ ữ ệ ả ượ
trì có nhi m v lo l u gi nh ng thông tin c n thi t mà ng d ng s c n đ n khiệ ụ ư ữ ữ ầ ế ứ ụ ẽ ầ ế
ph i hi n th k t xu t lên m t thi t b v t lý. GDI không bao gi cho phép ch ngả ể ị ế ấ ộ ế ị ậ ờ ươ
trình làm vi c tr c ti p v i m t DC mà GDI phân ph i cho ch ng trình m tệ ự ế ớ ộ ố ươ ộ
handle đ nh n d ng m t DC c th . T t c các hàm API; GDI đ u nh n thông sể ậ ạ ộ ụ ể ấ ả ề ậ ố
đ u tiên là m t handle – hdc.ầ ộ
DC là m t công c ch a các thu c tính v , DC cho phép k t n i logic m tộ ụ ứ ộ ẽ ế ố ộ
ch ng trình v m t thi t b c th nào đó. Ngoài ra do Windows là m t h đi u hànhươ ề ộ ế ị ụ ể ộ ệ ề
đa nhi m nên các ch ng trình không th truy xu t tr c ti p các thi t b v t lý đệ ươ ể ấ ự ế ế ị ậ ể
tránh xung đ t. Thay vào đó, ch ng trình Windows ph i s d ng k t n i logic doộ ươ ả ử ụ ế ố
DC đ i di n. Ngh a là t t c các ch ng trình cách ti p c n này đ GDI có th gi iạ ệ ĩ ấ ả ươ ế ậ ể ể ả
quy t tranh ch p khi 2 ch ng trình yêu c u dùng cùng m t thi t b nên DC còn cóế ấ ươ ầ ộ ế ị
vai trò làm permission slip. DC l u tr thông tin liên quan đ n m t b ng v vàư ữ ế ặ ằ ẽ
nh ng kh n ng c a nó. Tr c khi s d ng b t k hàm v GDI nào thì đi u ph iữ ả ă ủ ướ ử ụ ấ ỳ ẽ ề ả
t o m t DC cho thi t b , và khi s d ng xong thì ph i tr nó v cho Windowsạ ộ ế ị ử ụ ả ả ề
nh m đ m b o cho ho t đ ng c a h th ng đ c thông su t b i vì s l ng DCằ ả ả ạ ộ ủ ệ ố ượ ố ở ố ượ
mà Windows qu n lý là có gi i h n.ả ớ ạ
DC Win16: Ng c nh thi t b (DC) là m t n i k t gi a m t ng d ngở ữ ả ế ị ộ ố ế ữ ộ ứ ụ

Windows, m t driver thi t b và m t thi t b đ u ra (output device). Windows duyộ ế ị ộ ế ị ầ
trì m t cache g m 5 DC đ c bi t cho ho t đ ng h th ng. ng d ng ph i gi iộ ồ ặ ệ ạ ộ ệ ố Ứ ụ ả ả
phóng các DC này sau khi s d ng.ử ụ
Lu ng thông tin t ng d ng Windows qua DC và device driver t i thi t bồ ừ ứ ụ ớ ế ị
đ u ra:ầ
Truy xu t thi t b đ u ra (Accessing Output Devices): B t k ng d ngấ ế ị ầ ấ ỳ ứ ụ
Windows nào c ng có th s d ng hàm GDI đ truy xu t m t thi t b đ u ra. GDIũ ể ử ụ ể ấ ộ ế ị ầ
chuy n các g i đ c l p thi t b t ng d ng t i driver thi t b . R i driver thi t bể ọ ộ ậ ế ị ừ ứ ụ ớ ế ị ồ ế ị
thông d ch các g i đó vào trong s ho t đ ng đ c l p thi t b .ị ọ ự ạ ộ ộ ậ ế ị
Nh ng đ c tính c a DC mô t các đ i t ng v đ c ch n (pens và brushes),ữ ặ ủ ả ố ượ ẽ ượ ọ
font đ c ch n và màu c a nó, cách th c mà đ i t ng đ c v (hay ánh x ) t i thi tượ ọ ủ ứ ố ượ ượ ẽ ạ ớ ế
b , vùng trên thi t b có s n cho output (vùng xén) và nh ng thông tin quan tr ng khác.ị ế ị ẵ ữ ọ
C u trúc ch a nh ng đ c tính DC đ c g i là kh i d li u DC.ấ ứ ữ ặ ượ ọ ố ữ ệ
Windows
Application
GDI
Device
Context
Device
Driver
Output
Device
Windows
Application
Windows
Application
Device
Driver
Device
Driver

Output
Device
Output
Device
3 - Ch d ánh x (mapping mode):ế ộ ạ
duy trì s đ c l p thi t b , GDI t o ra output không gian lu n lý và ánhĐể ự ộ ậ ế ị ạ ở ậ
x nó lên màn hình. Ch đ ánh x cho bi t m i quan h gi a không gian lu n lý vàạ ế ộ ạ ế ố ệ ữ ậ
nh ng pixel trên thi t b .ữ ế ị
Có t i 8 ch đ ánh x khác nhau nh ng chúng tôi ch quan tâm t i ch đ ánh xớ ế ộ ạ ư ỉ ớ ế ộ ạ
MM_TEXT vì đây là ch đ ánh x m c đ nh. Trong ch đ này m t đ n v lu n lýế ộ ạ ặ ị ế ộ ộ ơ ị ậ
đ c ánh x t i m t pixel trên thi t b hay màn hình. Nh v y đ n v tính lu n lý làượ ạ ớ ộ ế ị ư ậ ơ ị ậ
pixel và các t a đ x, y c ng đ c tính theo pixel, tr x t ng khi qua ph i và gi mọ ộ ũ ượ ị ă ả ả
khi qua trái, tr y t ng khi đi xu ng và gi m khi đi lên. Origin c a h th ng t a đ làị ă ố ả ủ ệ ố ọ ộ
góc trái-trên (upper-left) c a màn hình.ủ
4 - H th ng t a windows:ệ ố ọ độ
Windows s d ng các h th ng t a đ khác nhau tùy theo hoàn c nh nh :ử ụ ệ ố ọ ộ ả ư
H to đ thi t b (Device coordinate system)ệ ạ ộ ế ị
- H to đ toàn màn hình (Full screen coordinate system)ệ ạ ộ
- H to đ vùng client (Client area coordinate system)ệ ạ ộ
- H to đ toàn c a s (Whole window coordinate system)ệ ạ ộ ử ổ
- H to đ logic (Logical coordinate system)ệ ạ ộ
Trong ph m vi ng d ng c a đ tài chúng tôi ch quan tâm đ n các h to đ :ạ ứ ụ ủ ề ỉ ế ệ ạ ộ
a) Full screen coordinate system:
Là h th ng t a đ thi t b liên quan t i tr n màn hình. T a đ màn hình đ cệ ố ọ ộ ế ị ớ ọ ọ ộ ượ
tính theo pixel và ch n t a đ (0,0) làm góc upper-left c a màn hình. H th ng nàyọ ọ ộ ủ ệ ố
s d ng khi liên quan đ n tr n màn hình trên t a đ màn hình. Th ng v trí c a m tử ụ ế ọ ọ ộ ườ ị ủ ộ
đ i t ng nh con nháy ho c con tr ho c c a s so v i góc upper-left c a mànố ượ ư ặ ỏ ặ ử ổ ớ ủ
hình thì dùng h t a đ này.ệ ọ ộ
b) Client area coordinate system:
C ng là h t a đ thi t b , nó khác v i h t a đ tr n màn hình origin c a hũ ệ ọ ộ ế ị ớ ệ ọ ộ ọ ở ủ ệ

t a đ . T a đ tr n màn hình là t ng đ i so v i upper-left c a màn hình còn t a đọ ộ ọ ộ ọ ươ ố ớ ủ ọ ộ
vùng client là t ng đ i so v i upper-left c a vùng client. T a đ này c ng tính theoươ ố ớ ủ ọ ộ ũ
device unit (pixel) gi ng nh t a đ màn hình.ố ư ọ ộ
Hàm ClientToScreen đ chuy n t a đ vùng client qua t a đ tr n màn hình.ể ể ọ ộ ọ ộ ọ
Hàm ScreenToClient chuy n t a đ tr n màn hình qua t a đ vùng client.ể ọ ộ ọ ọ ộ
c) Whole window coordinate system:
G n gi ng h t a đ vùng client, là t ng đ i so v i góc upper-left c a c aầ ố ệ ọ ộ ươ ố ớ ủ ử
s , đ c s d ng khi v vùng nonclient c a c a s .ổ ượ ử ụ ẽ ủ ử ổ
d) Logical coordinate:
H u h t các hàm GDI s d ng h t a đ này. H th ng t a đ logic khôngầ ế ử ụ ệ ọ ộ ệ ố ọ ộ
ph i là h th ng t a đ thi t b , h th ng t a đ logic bao gi c ng đ c ánh x lênả ệ ố ọ ộ ế ị ệ ố ọ ộ ờ ũ ượ ạ
m t h th ng t a đ thi t b . H t a đ logic có th đ c ánh x lên h t a đ toànộ ệ ố ọ ộ ế ị ệ ọ ộ ể ượ ạ ệ ọ ộ
màn hình, h t a đ vùng client ho c h t a đ toàn c a s .ệ ọ ộ ặ ệ ọ ộ ử ổ
Dùng hàm DPtoLP đ chuy n t a đ thi t b sang h t a đ logic.ể ể ọ ộ ế ị ệ ọ ộ
Dùng hàm LPtoDP đ chuy n t a đ logic sang h t a đ thi t b .ể ể ọ ộ ệ ọ ộ ế ị
Nh v y đi u quan tr ng trong vi c tính toán s d ng h t a đ là ph i ki mư ậ ề ọ ệ ử ụ ệ ọ ộ ả ể
soát đ c vi c s d ng các h t a đ m t cách đ ng b b i vì vi c chuy n đ i gi aượ ệ ử ụ ệ ọ ộ ộ ồ ộ ở ệ ể ổ ữ
các h t a đ đã đ c cung c p b i các hàm nêu trên.ệ ọ ộ ượ ấ ở
5 - Viewport và window:
Mapping mode cho bi t ánh x t a đ logic và nh ng kích th c đ c cungế ạ ọ ộ ữ ướ ượ
c p khi g i các hàm GDI qua h th ng t a đ thi t b g n li n v i DC. T c làấ ọ ệ ố ọ ộ ế ị ắ ề ớ ứ
mapping mode quy t đ nh GDI ánh x vi c ánh x m t window (t a đ logic) quaế ị ạ ệ ạ ộ ọ ộ
m t viewport (t a đ thi t b ). Viewport ngh a là m t vùng hình ch nh t c a hộ ọ ộ ế ị ĩ ộ ữ ậ ủ ệ
th ng t a đ thi t b đ c đ nh ngh a b i m t DC còn window khi s d ng đ quiố ọ ộ ế ị ượ ị ĩ ở ộ ử ụ ể
chi u GDI mapping mode là m t hình ch nh t c a h th ng t a đ logic đ cế ộ ữ ậ ủ ệ ố ọ ộ ượ
đ nh ngh a b i m t DC.ị ĩ ở ộ
Công th c đ chuy n đ i m t h t a đ window (logic) qua m t h t a đứ ể ể ổ ộ ệ ọ ộ ộ ệ ọ ộ
viewport (thi t b ):ế ị
xviewport = (xwindow - xwindowOrg)(xviewportExt / xwindowExt) +
xviewportOrg

yviewport = (ywindow - ywindowOrg)(yviewportExt / ywindowExt) +
yviewportOrg
Trong đó:
(xwindow,ywindow) là đi m trên t a đ logic đ c chuy n đ i thành đi mể ọ ộ ượ ể ổ ể
(xviewport,yviewport)
(xwindowOrg,ywindowOrg) và (xviewportOrg,yviewportOrg) là origin c aủ
vùng hình ch nh t window và viewport theo m c nhiên các đi m này đ c cho vữ ậ ặ ể ượ ề
(0,0) trên DC m c nhiên.ặ
Công th c s d ng 2 đi m cho bi t extent c a m t vùng theo t a đ logicứ ử ụ ể ế ủ ộ ọ ộ
(xwindowExt,ywindowExt) và c a m t vùng theo h t a đ thi t bủ ộ ệ ọ ộ ế ị
(xviewportExt,yviewportExt).
T l c a (viewpot extent / window extent) là h s scaling dùng đ d ch đ nỉ ệ ủ ệ ố ể ị ơ
v logic qua đ n v thi t b .ị ơ ị ế ị
Vi c chuy n đ i ng c l i t ng t b ng các bi n đ i công th c trên.ệ ể ổ ượ ạ ươ ự ằ ế ổ ứ
IV - C A S TRONG WINDOWS:Ử Ổ
C a s là khái ni m c b n trong giao di n GDI c a Windows, nó là m t ki nử ổ ệ ơ ả ệ ủ ộ ế
trúc chu n m c đ t đó xây d ng nên các đ i t ng khác nh : c a s chính c a ngẩ ự ể ừ ự ố ượ ư ử ổ ủ ứ
d ng (main frame); text box; edit control; button; combo box; menu; scroll bar; ụ
nói chung là toàn b nh ng công c t o nên giao di n GDI đ u có th g i là c a s .ộ ữ ụ ạ ệ ề ể ọ ử ổ
C ng có th xem c a s nh vùng ch nh t màn hình mà n i đó ng d ng in ra cácũ ể ử ổ ư ữ ậ ơ ứ ụ
k t xu t và nh n các d li u t ng i dùng.ế ấ ậ ữ ệ ừ ườ
Windows qu n lý t t c c a s hi n có trong h th ng b ng cách gán cho m iả ấ ả ử ổ ệ ệ ố ằ ỗ
c a s m t handle (trên th c t nó là m t s nguyên), ta ch c n có đ c handle c aử ổ ộ ự ế ộ ố ỉ ầ ượ ử
s thì có th thao tác m i th trên c a s đó.ổ ể ọ ứ ử ổ
M t c a s chia s màn hình v i các c a s khác, k c các c a s c a ngộ ử ổ ẻ ớ ử ổ ể ả ử ổ ủ ứ
d ng khác. Ch có m t c a s trong m t th i đi m có th nh n d li u nh p tụ ỉ ộ ử ổ ộ ờ ể ể ậ ữ ệ ậ ừ
ng i dùng. Ng i dùng có th dùng chu t, bàn phím, hay các thi t b nh p khác đườ ườ ể ộ ế ị ậ ể
t ng tác v i c a s này và ng d ng s h u nó.ươ ớ ử ổ ứ ụ ở ữ
1 - Các lo i c a s :ạ ử ổ
Windows cung c p nhi u ki u c a s khác nhau đ có th k t h p hình thànhấ ề ể ử ổ ể ể ế ợ

nên các hình th c c a s khác nhau. Các ki u đ c s d ng trong hàmứ ử ổ ể ượ ử ụ
CreateWindow khi c a s đ c t o.ử ổ ượ ạ
M t s ki u c a s sau:ộ ố ể ử ổ
- C a s ch ng lên nhau (Overlapped windows hay top-level window): là c aử ổ ồ ử
s không bao gi có c a s cha m .ổ ờ ử ổ ẹ
- C a s b s h u (Owned windows): là ki u đ c bi t, đ c s h u b i m tử ổ ị ở ữ ể ặ ệ ượ ở ữ ở ộ
c a s b ch ng ử ổ ị ồ
- C a s pop-up: là ki u đ c bi t c a c a s overlapped nh ng có th cóử ổ ể ặ ệ ủ ử ổ ư ể
ho c không title bar.ặ
- C a s con: là c a s xác đ nh vùng client c a c a s cha m , đ c s d ngử ổ ử ổ ị ủ ử ổ ẹ ượ ử ụ
đ chia vùng client c a c a s cha m ra thành các vùng ch c n ng khác nhau. M tể ủ ử ổ ẹ ứ ă ộ
ng d ng dùng hàm ShowWindow đ cho th y hay che d u m t c a s con. M iứ ụ ể ấ ấ ộ ử ổ ỗ
c a s con ph i có m t c a s cha m . C a s cha m nh ng m t ph n trongử ổ ả ộ ử ổ ẹ ử ổ ẹ ườ ộ ầ
vùng c a nó cho c a s con và c a s con s nh n t t c các tác đ ng t bên ngoài vàoủ ử ổ ử ổ ẽ ậ ấ ả ộ ừ
vùng này. M t c a s con có th có nhi u c a s con khác và m i c a s con đ u cóộ ử ổ ể ề ử ổ ỗ ử ổ ề
cho riêng nó m t handle riêng đ giao d ch khi g i thông đi p cho c a s cha m .ộ ể ị ở ệ ử ổ ẹ
M i c a s con là m t c a s đ c l p, nó nh n tác đ ng bên ngoài c a riêng nó và cácỗ ử ổ ộ ử ổ ộ ậ ậ ộ ủ
thông đi p khác. Nh ng input g i cho c a s con đ c đi tr c ti p t i c a s conệ ữ ở ử ổ ượ ự ế ớ ử ổ
và không chuy n qua c a s cha m ngo i tr tr ng h p c a s con b hàmể ử ổ ẹ ạ ừ ườ ợ ử ổ ị
EnabledWindow cho disabled. Trong tr ng h p này thì Windows chuy n b t kườ ợ ể ấ ỳ
input nào t i c a s con đó cho c a s cha m c a nó. i u này cho phép c a sớ ử ổ ử ổ ẹ ủ Đ ề ử ổ
cha m ki m tra đ c input và làm cho c a s con tr ng thái enabled n u nó th yẹ ể ượ ử ổ ở ạ ế ấ
đi u đó là c n thi t.ề ầ ế
Nh ng ho t đ ng c a c a s cha m c ng nh h ng đ n c a s con nhữ ạ ộ ủ ử ổ ẹ ũ ả ưở ế ử ổ ư
sau:
- Shown: C a s cha m s đ c hi n th tr c c a s con.ử ổ ẹ ẽ ượ ể ị ướ ử ổ
- Hidden: C a s cha m s b che sau c a s con. C a s con s đ cử ổ ẹ ẽ ị ử ổ ử ổ ẽ ượ
nhìn th y (h t b che) (visible) ch khi c a s cha m đ c nhìn th y.ấ ế ị ỉ ử ổ ẹ ượ ấ
- Destroyed: C a s cha m b hu sau c a s con.ử ổ ẹ ị ỷ ử ổ
- Moved: C a s con b di chuy n cùng v i vùng client c a c a s cha m .ử ổ ị ể ớ ủ ử ổ ẹ

C a s con đáp ng cho vi c tô v sau khi di chuy n.ử ổ ứ ệ ẽ ể
- Gia t ng kích th c hay tr ng thái kích th c c c đ i: tô v b t k ph nă ướ ở ạ ướ ự ạ ẽ ấ ỳ ầ
nào c a c a s cha m mà đã đ c ph i bày ra nh là k t qu c a kích th c t ng lênủ ử ổ ẹ ượ ơ ư ế ả ủ ướ ă
c a vùng client.ủ
Windows không t đ ng xén (clip) m t c a s con ra kh i vùng client c aự ộ ộ ử ổ ỏ ủ
c a s cha m . i u này ngh a là c a s cha m v lên trên c a s con n u n u nóử ổ ẹ Đ ề ĩ ử ổ ẹ ẽ ử ổ ế ế
ti n hành b t k s tô v nào trong cùng v trí v i v trí c a c a s con. Windowsế ấ ỳ ự ẽ ị ớ ị ủ ử ổ
ch xén c a s con ra kh i vùng client c a c a s cha m n u c a s cha m cóỉ ử ổ ỏ ủ ử ổ ẹ ế ử ổ ẹ
ki u WS_CLIPCHILDREN. N u c a s con b xén thì c a s cha m không thể ế ử ổ ị ử ổ ẹ ể
tô v lên nó. M t c a s con có th ch ng lên các c a s con khác trong cùng vùngẽ ộ ử ổ ể ồ ử ổ
client. C a s anh em (cùng cha m ) có th tô v trong m i vùng client c a các c aử ổ ẹ ể ẽ ỗ ủ ử
s khác tr khi m t c a s con có ki u WS_CLIPSIBLINGS. N u ng d ng xácổ ừ ộ ử ổ ể ế ứ ụ
đ nh ki u này cho m t c a s con thì b t k ph n nào c a c a s anh em c a c aị ể ộ ử ổ ấ ỳ ầ ủ ử ổ ủ ử
s con đó n m trong c a s này đ u b xén. N u m t c a s có ki uổ ằ ử ổ ề ị ế ộ ử ổ ể
WS_CLIPCHILDREN ho c WS_CLIPSIBLINGS thì m t m t mát nh trong sặ ộ ấ ỏ ự
th c hi n (performance) x y ra. M i c a s chi m tài nguyên h th ng b i v yự ệ ả ỗ ử ổ ế ệ ố ở ậ
ng d ng s không s d ng các c a s con m t cách b a bãi. ho t đ ng t i uứ ụ ẽ ử ụ ử ổ ộ ừ Để ạ ộ ố ư
m t ng d ng c n chia lu n lý c a s chính c a nó trong th t c c a s c a c aộ ứ ụ ầ ậ ử ổ ủ ủ ụ ử ổ ủ ử
s chính còn h n là dùng các c a s con.ổ ơ ử ổ
2 - Th t c c a s (Window Procedures):ủ ụ ử ổ
M t th t c c a s x lý t t c nh ng thông đi p đ c g i t i t t c các c aộ ủ ụ ử ổ ử ấ ả ữ ệ ượ ở ớ ấ ả ử
s trong l p đ c đ a ra. Windows g i các thông đi p t i th t c c a s khi nóổ ớ ượ ư ở ệ ớ ủ ụ ử ổ
nh n input t user có ý đ nh chuy n cho c a s đ c đ a ra hay khi nó c n th t cậ ừ ị ể ử ổ ượ ư ầ ủ ụ
đ th c hi n m t vài hành đ ng trên c a s c a nó nh vi c tô v l i bên trong vùngể ự ệ ộ ộ ử ổ ủ ư ệ ẽ ạ
client.
Th t c c a s nh n các ki u thông đi p nh : nh p vào t bàn phím, chu t;ủ ụ ử ổ ậ ể ệ ư ậ ừ ộ
yêu c u tiêu đ c a s ; t ng thu t s thay đ i gây ra b i c a s khác (nh thay đ iầ ề ử ổ ườ ậ ự ổ ở ử ổ ư ổ
file WIN.INI); c h i s a đ i đáp ng h th ng tiêu chu n đ n nh ng ho t đ ngơ ộ ử ổ ứ ệ ố ẩ ế ữ ạ ộ
ch c ch n (nh đi u ch nh menu tr c lúc hi n th ); yêu c u th c hi n m t vài hànhắ ắ ư ề ỉ ướ ể ị ầ ự ệ ộ
đ ng trên c a s hay vùng client c a nó (c p nh t vùng client); thông tin v tìnhộ ử ổ ủ ậ ậ ề

tr ng c a nó trong m i quan h v i các c a s khác (truy xu nh t đ nh th t b iạ ủ ố ệ ớ ử ổ ấ ấ ị ấ ạ
c a nó t i bàn phím hay tr thành c a s ho t đ ng).ủ ớ ở ử ổ ạ ộ
M t th t c c a s nh n h u h t các thông đi p là t Windows nh ng nóộ ủ ụ ử ổ ậ ầ ế ệ ừ ư
c ng có th nh n thông đi p t các c a s khác g m c nh ng c a s nó s h u.ũ ể ậ ệ ừ ử ổ ồ ả ữ ử ổ ở ữ
Nh ng thông đi p này có th là nh ng yêu c u v thông tin hay thông báo mà m t sữ ệ ể ữ ầ ề ộ ư
ki n đ c đ a ra đã x y ra trong m t c a s khác. M t th t c c a s ti p t cệ ượ ư ả ộ ử ổ ộ ủ ụ ử ổ ế ụ
nh n thông đi p f h th ng và có th ch p nh n nh ng c a s khác trong hậ ệ ừ ệ ố ể ấ ậ ữ ử ổ ệ
th ng cho đ n khi th t c c a s , th t c c a s c a m t c a s cha m hay hố ế ủ ụ ử ổ ủ ụ ử ổ ủ ộ ử ổ ẹ ệ
th ng h y c a s . Ngay c khi c a s trong quá trình đang b h y, th t c c aố ủ ử ổ ả ử ổ ở ị ủ ủ ụ ử
s nh n nh ng thông đi p thêm vào đ a t i nó c h i đ ti n hành b t k nhi m vổ ậ ữ ệ ư ớ ơ ộ ể ế ấ ỳ ệ ụ
làm s ch (cleanup) nào tr c lúc k t thúc. Nh ng thông đi p này g m WM_ ,ạ ướ ế ữ ệ ồ
WM_DESTROY, WM_QUERYENDSESSION và WM_ENDSESSION. Nh ngư
khi c a s b h y thì không có thêm thông đi p nào đ c đ a t i th t c cho c a sử ổ ị ủ ệ ượ ư ớ ủ ụ ử ổ
c th đó. N u có nhi u h n m t c a s c a l p, tuy nhiên, th t c c a s ti pụ ể ế ề ơ ộ ử ổ ủ ớ ủ ụ ử ổ ế
t c nh n thông đi p cho nh ng c a s khác cho đ n khi c ng chính chúng b h y.ụ ậ ệ ữ ử ổ ế ũ ị ủ
M t th t c c a s ch rõ làm th nào t t c c a s c a m t c a s đ a ra th c sộ ủ ụ ử ổ ỉ ế ấ ả ử ổ ủ ộ ử ổ ư ự ự
có hành vi b ng cách đáp ng nh ng gì các c a s t o ra nh ng l nh t user hay hằ ứ ữ ử ổ ạ ữ ệ ừ ệ
th ng. Th t c c a s ph i ki m tra nh ng thông đi p mà nó nh n t h th ng vàố ủ ụ ử ổ ả ể ữ ệ ậ ừ ệ ố
quy t đ nh b t k hành đ ng gì s di n ra. Th t c c a s c ng có th ch nế ị ấ ỳ ộ ẽ ễ ủ ụ ử ổ ũ ể ọ
không đáp ng m t thông đi p đ c đ a ra. N u không đáp ng th t c ph i chuy nứ ộ ệ ượ ư ế ứ ủ ụ ả ể
thông đi p t i hàm DefWindowProc đ đ a cho h th ng c h i đ đáp ng. Hàm nàyệ ớ ể ư ệ ố ơ ộ ể ứ
th c hi n hành đ ng có s n trên c s thông đi p đ c đ a ra và nh ng thông s c aự ệ ộ ẵ ơ ở ệ ượ ư ữ ố ủ
nó. Nhi u thông đi p (đ c bi t là thông đi p vùng non-client) ph i đ c x lý vì thề ệ ặ ệ ệ ả ượ ử ế
DefWindowProc đ c yêu c u trong t t c các th t c c a s .ượ ầ ấ ả ủ ụ ử ổ
Th t c c a s c ng nh n các thông đi p mà th c s đã d đ nh đ c x lý b iủ ụ ử ổ ũ ậ ệ ự ự ự ị ượ ử ở
h th ng. Nh ng thông đi p vùng-nonclient thông báo cho th t c bi t user th cệ ố ữ ệ ủ ụ ế ự
hi n m t vài hành đ ng trong vùng client c a c a s ho c m t vài thông tin v c aệ ộ ộ ủ ử ổ ặ ộ ề ử
s đ c yêu c u b i h th ng đ th c hi n m t hành đ ng. M c dù Windowsổ ượ ầ ở ệ ố ể ự ệ ộ ộ ặ
chuy n nh ng thông đi p này t i th t c c a s thì th t c s chuy n chúng choể ữ ệ ớ ủ ụ ử ổ ủ ụ ẽ ể
hàm DefWindowProc và không c g ng x lý chúng. tr ng h p này th t c c aố ắ ử Ở ườ ợ ủ ụ ử

s ph i ph t l thông đi p hay tr v không chuy n nó t i DefWindowProc.ổ ả ớ ờ ệ ả ề ể ớ
3) Thông i p c a s :đ ệ ử ổ
M t thông đi p c a s là m t t p nh ng giá tr mà Windows g i t i th t cộ ệ ử ổ ộ ậ ữ ị ở ớ ủ ụ
c a s đ cung c p input cho c a s hay yêu c u c a s th c hi n m t vài hànhử ổ ể ấ ử ổ ầ ử ổ ự ệ ộ
đ ng. Windows tính đ n m t s thay đ i r ng kh p nh ng thông đi p mà nó hayộ ế ộ ự ổ ộ ắ ữ ệ
ng d ng c a nó có th g i t i th t c c a s . H u h t nh ng thông đi p đ cứ ụ ủ ể ở ớ ủ ụ ử ổ ầ ế ữ ệ ượ
g i t i c a s nh là k t qu c a hàm đ a ra đang đ c th c thi hay nh là k t quở ớ ử ổ ư ế ả ủ ư ượ ự ư ế ả
c a input t user. M i thông đi p g m 4 giá tr : m t handle xác đ nh c a s , m tủ ừ ỗ ệ ồ ị ộ ị ử ổ ộ
danh hi u thông đi p, m t giá tr thông đi p-đ c bi t 16-bit và m t giá tr thông đi p-ệ ệ ộ ị ệ ặ ệ ộ ị ệ
đ c bi t 32-bit. Nh ng giá tr này đ c chuy n t i th t c c a s nh là nh ngặ ệ ữ ị ượ ể ớ ủ ụ ử ổ ư ữ
thông s riêng l . R i th t c c a s ki m tra danh hi u thông đi p đ quy t đ nhố ẻ ồ ủ ụ ử ổ ể ệ ệ ể ế ị
nh ng đáp ng gì ph i làm và làm th nào đ thông d ch giá tr 16-bit và 32-bit.ữ ứ ả ế ể ị ị
Cú pháp th t c c a s :ủ ụ ử ổ
- LONG FAR PASCAL WndProc(hwnd, wMsg, wParam, lParam)
HWND hwnd;
WORD wMsg;
WORD wParam;
DWORD lParam;
Các thông s :ố
hwnd cho bi t c a s nh n thông đi pế ử ổ ậ ệ
wMsg lo i thông đi pạ ệ
wParam thông tin thông đi p-đ c bi t thêm vào 16-bitệ ặ ệ
lParam thông tin thông đi p-đ c bi t thêm vào 32-bitệ ặ ệ
Hàm tr v giá tr 32-bit cho bi t k t qu x lý thông đi pả ề ị ế ế ả ử ệ
4 - Default window procedure:
Hàm DefWindowProc là ph n x lý thông đi p có s n cho nh ng th t c c aầ ử ệ ẵ ữ ủ ụ ử
s không hay không th truy xu t m t vài thông đi p đ c g i t i cho chúng. H uổ ể ấ ộ ệ ượ ở ớ ầ
h t các th t c c a s thì hàm DefWindowProc th c hi n h u h t, n u khôngế ủ ụ ử ổ ự ệ ầ ế ế
mu n nói là t t c , vi c x lý thông đi p vùng client. ây là các thông đi p bi u hi nố ấ ả ệ ử ệ Đ ệ ể ệ
nh ng hành đ ng đ c th c hi n trên các ph n khác c a c a s h n là vùng client.ữ ộ ượ ự ệ ầ ủ ử ổ ơ

5 - V n tô v màn hình:ấ đề ẽ
Khi m t c a s b di chuy n thì Windows t đ ng sao chép n i dung c aộ ử ổ ị ể ự ộ ộ ủ
vùng client t i v trí m i. i u này ti t ki m th i gian b i vì m t c a s khôngớ ị ớ Đ ề ế ệ ờ ở ộ ử ổ
ph i tính toán l i và v l i n i dung c a vùng client nh là ph n c a s di chuy n.ả ạ ẽ ạ ộ ủ ư ầ ủ ự ể
N u c a s di chuy n hay thay đ i kích th c thì Windows ch sao chép ph n l nế ử ổ ể ổ ướ ỉ ầ ớ
vùng client tr c đó khi nó c n đi n v trí m i. N u c a s gia t ng kích th c thìướ ầ ề ị ớ ế ử ổ ă ướ
Windows sao chép toàn b vùng client và g i thông báo WM_PAINT t i c a s độ ở ớ ử ổ ể
đi n vào trong vùng đ c ph i bày m i h n. Khi c a s b di chuy n thì Windowsề ượ ơ ớ ơ ử ổ ị ể
cho r ng n i dung c a vùng client v n h p l và có th đ c sao chép không c nằ ộ ủ ẫ ợ ệ ể ượ ầ
thay d i t i v trí m i. Tuy nhiên v i m t vài c a s thì n i dung c a vùng clientổ ớ ị ớ ớ ộ ử ổ ộ ủ
không còn h p l sau khi di chuy n đ c bi t là n u di chuy n luôn s thay đ i kíchợ ệ ể ặ ệ ế ể ự ổ
th c. tô v l i toàn b vùng client thay cho sao chép n i dung tr c đó m i l nướ Để ẽ ạ ộ ộ ướ ỗ ầ
m t c a s thay đ i kích th c thì m t c a s s xác đ nh ki u CS_VREDRAW vàộ ử ổ ổ ướ ộ ử ổ ẽ ị ể
trong l p c a s .ớ ử ổ
qu n lý hi n th màn hình, Windows ti n hành nhi u ho t đ ng nhĐể ả ể ị ế ề ạ ộ ả
h ng t i n i dung c a vùng client. N u Windows di chuy n, đ nh kích th cưở ớ ộ ủ ế ể ị ướ
hay thay đ i b m t màn hình, s thay đ i có th nh h ng c a s đ c đ a ra.ổ ề ặ ự ổ ể ả ưở ử ổ ượ ư
N u v y, Windows đánh d u vùng b thay đ i b ng ho t đ ng s n sàng cho vi c c pế ậ ấ ị ổ ằ ạ ộ ẵ ệ ậ
nh t và c h i ti p theo nó g i thông đi p WM_PAINT t i c a s vì th nó cóậ ở ơ ộ ế ở ệ ớ ử ổ ế
th c p nh t c a s trong vùng c n c p nh t. N u m t c a s v trong vùngể ậ ậ ử ổ ầ ậ ậ ế ộ ử ổ ẽ
client c a nó thì nó ph i g i BeginPaint đ l y handle c a ng c nh màn hình,ủ ả ọ ể ấ ủ ữ ả
ph i c p nh t vùng b thay đ i nh đã đ nh ngh a b i vùng c p nh t và cu i cùng nóả ậ ậ ị ổ ư ị ĩ ở ậ ậ ố
ph i g i EndPaint đ hoàn t t công vi c. M t c a s có th v trong vùng clientả ọ ể ấ ệ ộ ử ổ ể ẽ
c a nó b t k lúc nào t c là ngoài th i đi m mà nó đáp ng thông đi p WM_PAINT chủ ấ ỳ ứ ờ ể ứ ệ ỉ
c n nó l y ng c nh màn hình cho vùng client tr c lúc nó ti n hành v .ầ ấ ữ ả ướ ế ẽ
Thông đi p WM_PAINT: là m t yêu c u c a Windows t i m t c a s đ c pệ ộ ầ ủ ớ ộ ử ổ ể ậ
nh t màn hình c a nó. Windows g i WM_PAINT b t c khi nào c n v m t ph nậ ử ở ấ ứ ầ ẽ ộ ầ
l i c a s . Khi c a s nh n thông đi p WM_PAINT thì nó s l y vùng c p nh tạ ử ổ ử ổ ậ ệ ẽ ấ ậ ậ
b ng hàm BeginPaint và nó s ti n hành b t k ho t đ ng gì c n thi t đ c p nh tằ ẽ ế ấ ỳ ạ ộ ầ ế ể ậ ậ
ph n đó c a vùng client.ầ ủ

InvalidateRect và InvalidateRgn th c s không sinh ra thông đi pự ự ệ
WM_PAINT. Windows tích lu nh ng thay đ i đ c t o ra b i các hàm này vàỹ ữ ổ ượ ạ ở
nh ng thay đ i c a riêng nó trong lúc m t c a s x lý nh ng thông đi p khác trongữ ổ ủ ộ ử ổ ử ữ ệ
hàng thông đi p c a nó. Làm tr WM_PAINT làm cho c a s x lý t t c nh ngệ ủ ễ ử ổ ử ấ ả ữ
thay đ i cùng m t lúc thay vì c p nh t nh ng nh ng m u nh trong nh ng b cổ ộ ậ ậ ữ ữ ẫ ỏ ữ ướ
riêng l làm lãng phí th i gian.ẻ ờ
ch th Windows g i thông đi p WM_PAINT m t ng d ng có th sĐể ỉ ị ở ệ ộ ứ ụ ể ử
d ng UpdateWindow, hàm này g i thông đi p tr c ti p t i c a s , b t ch pụ ở ệ ự ế ớ ử ổ ấ ấ
nh ng thông đi p khác trong hàng thông đi p c a ng d ng. UpdateWindow đ cữ ệ ệ ủ ứ ụ ượ
s d ng khi m t c a s c n c p nh t vùng client c a nó ngay l p t c (ch ng h nử ụ ộ ử ổ ầ ậ ậ ủ ậ ứ ẳ ạ
ch ngay sau c a s đ c t o). Khi m t c a s nh n WM_PAINT nó ph i g iỉ ử ổ ượ ạ ộ ử ổ ậ ả ọ
BeginPaint đ l y ng c nh màn hình cho vùng client và l y thông tin khác nh vùngể ấ ữ ả ấ ư
c p nh t và background b xóa hay không. Windows t đ ng ch n vùng c p nh tậ ậ ị ự ộ ọ ậ ậ
nh là vùng xén c a ng c nh màn hình. GDI hu b (xén) nh ng gì đ c v bên ngoàiư ủ ữ ả ỷ ỏ ữ ượ ẽ
vùng xén ch nh ng gì bên trong vùng c p nh t là th c s nhìn th y đ c.ỉ ữ ở ậ ậ ự ự ấ ượ
BeginPaint xóa vùng c p nh t đ ng n ch n vùng gi ng nhau t vi c sinh ra cácậ ậ ể ă ặ ố ừ ệ
thông đi p WM_PAINT đ n sau. Sau khi v xong Windows ph i g i hàmệ ế ẽ ả ọ
EndPaint đ gi i phóng DC.ể ả
Vùng c p nh t: M t vùng c p nh t xác đ nh ph n c a vùng client đ c đánh d uậ ậ ộ ậ ậ ị ầ ủ ượ ấ
cho vi c v cho thông đi p WM_PAINT k ti p. M c đích c a vùng c p nh t là đệ ẽ ệ ế ế ụ ủ ậ ậ ể
l u các ng d ng th i đi m nó đ a ra đ v toàn b n i dung c a vùng client. N uư ứ ụ ờ ể ư ể ẽ ộ ộ ủ ế
ch có ph n mà c n v đ c c ng vào vùng c p nh t thì ch có ph n đó đ c v .ỉ ầ ầ ẽ ượ ộ ậ ậ ỉ ầ ượ ẽ
Hàm InvalidateRect và InvalidateRgn c ng m t hình ch nh t hay m t vùngộ ộ ữ ậ ộ
vào vùng c p nh t. Hình ch nh t hay vùng ph i đ c đ a ra trong t a đ client.ậ ậ ữ ậ ả ượ ư ở ọ ộ
Vùng c p nh t b n thân nó đ c đ nh ngh a trong t a đ client. Windows c ngậ ậ ả ượ ị ĩ ọ ộ ộ
nh ng vùng và hình ch nh t c a chính nó vào m t vùng c p nh t c a c a s sauữ ữ ậ ủ ộ ậ ậ ủ ử ổ
khi nh ng ho t đ ng nh di chuy n, đ nh kích th c và cu n c a s .ữ ạ ộ ư ể ị ướ ộ ử ổ
Hàm ValidateRect và ValidateRgn xóa m t hình ch nh t hay m t vùng raộ ữ ậ ộ
kh i vùng c p nh t. Nh ng hàm này đ c s d ng đi n hình khi c a s đã c p nh tỏ ậ ậ ữ ượ ử ụ ể ử ổ ậ ậ
m t ph n đ c bi t c a màn hình trong vùng c p nh t tr c khi nh n thông đi pộ ầ ặ ệ ủ ậ ậ ướ ậ ệ

WM_PAINT.
Hàm GetUpdateRect l y hình ch nh t nh nh t bao l y toàn b vùng c pấ ữ ậ ỏ ấ ấ ộ ậ
nh t. Hàm GetUpdateRgn l y vùng c p nh t chính nó. Nh ng hàm này có th đ cậ ấ ậ ậ ữ ể ượ
s d ng đ tính toán kích th c hi n hành c a vùng c p nh t đ quy t đ nh nh ngử ụ ể ướ ệ ủ ậ ậ ể ế ị ữ
công vi c v nào đ c yêu c u.ệ ẽ ượ ầ
V – CH NG TRÌNH WINDOWS TI P NH N THÔNG I P CHU T:ƯƠ Ế Ậ Đ Ệ Ộ
Gi i thi u dòng ch y d li u thông i p nh p t con chu t:ớ ệ ả ữ ệ đ ệ ậ ừ ộ
Hardware event
queue
Device driverMouse
GetMessage()
DispatchMessage()
WindowProc()
DefWindowProc()
Hook
chain
Virtual &
Scan code
1 - Mouse:
Khi mouse báo v trí c a mình (v trí cursor) và có tác đ ng lên mouse thì m t tínị ủ ị ộ ộ
hi u đ c phát đi t mouse gây ra m t ng t quãng, mouse driver gi i quy t ng tệ ượ ừ ộ ắ ả ế ắ
quãng này.
2 - Mouse device driver:
Khi Windows kh i đ ng thì mouse driver t đ ng n p vào và ki m tra xem cóở ộ ự ộ ạ ể
chu t hay không. N u có thì Windows g i driver cung c p m t th t c đ báo cáoộ ế ọ ấ ộ ủ ụ ể
các bi n c x y ra trên chu t. Khi có m t mouse event thì driver thông báo choế ố ả ộ ộ
Windows bi t. N u event là di chuy n mouse thì u tiên đáp ng v trí con tr diế ế ể ư ứ ị ỏ
chuy n ngay lúc ng t. Còn l i t t c các event khác đ u đ c đ a vào hardware eventể ắ ạ ấ ả ề ượ ư
queue.
3 - Hardware event queue:

Các mouse event đ c đ a vào hardware event queue ch giao cho messageượ ư ờ
loop c a ch ng trình gi i quy t. Queu này là m t vùng đ m có th ch a t i đa 120ủ ươ ả ế ộ ệ ể ứ ố
event. Nh ng event trong queue ch a thu c m t ch ng trình c th nào cho t iữ ư ộ ộ ươ ụ ể ớ
khi nó đ c ti p nh n b i hàm GetMessage(). i u này đ m b o cho h th ngượ ế ậ ở Đ ề ả ả ệ ố
ho t đ ng đúng đ n. Sau đó là vòng l p GetMessage().ạ ộ ắ ặ
4 - GetMessage() loop:
GetMessage() loop đ a các thông đi p vào x lý. GetMessage() s quy t đ như ệ ử ẽ ế ị
ch ng trình nào s ti p nh n thông đi p b ng cách xem ch ng trình nào s h uươ ẽ ế ậ ệ ằ ươ ở ữ
c a s mà con tr chu t n m trên đó. Tùy theo v trí c a con tr mà phát sinh hai lo iử ổ ỏ ộ ằ ị ủ ỏ ạ
thông đi p: thông đi p vùng client và thông đi p vùng non-client. Mu n bi t cursor ệ ệ ệ ố ế ở
vùng nào thì GetMessage() chuy n đi m t thông đi p WM_NCHITTEST cho thể ộ ệ ủ
t c c a s . Hàm GetMessage() d a vào c ch pull-model đ đ c thông tin tìnhụ ử ổ ự ơ ế ể ọ
hu ng trong queue và l i d a vào push-model đ bi t v trí c a cursor. T c làố ạ ự ể ế ị ủ ứ
GetMessage() s g i th t c c a s nh là m t ch ng trình th ng trú v y.ẽ ọ ủ ụ ử ổ ư ộ ươ ườ ậ
GetMessage() s d ng hàm SendMessage() đ g i th t c c a s . Tr tr vử ụ ể ọ ủ ụ ử ổ ị ả ề
n m trong ph m vi c a thông đi p WM_NCHITTEST mà GetMessage() g i choằ ạ ủ ệ ở
th t c c a s c a ta. WM_NCHITTEST là thông đi p đ n đ u tiên trong hàng lo tủ ụ ử ổ ủ ệ ế ầ ạ
thông đi p mà mouse phát ra. Nó yêu c u th t c c a s nh n di n v trí cursor. aệ ầ ủ ụ ử ổ ậ ệ ị Đ
s ch ng trình chuy n thông đi p này cho DefWindowProc() lo tìm v trí cursorố ươ ể ệ ị
và cung c p m t hit-test code nh là tr tr v .ấ ộ ư ị ả ề
Khi DefWindowProc() tr v k t qu khác HTCLIENT, HTERROR,ả ề ế ả
HTNOWHERE, HTTRANSPARENT thì cursor n m trên vùng non-client thìằ
Windows s phát đi thông đi p non-client.ẽ ệ
Còn khi DefWindows tr v k t qu HTCLIENT thì cursor n m trên vùngả ề ế ả ằ
client và nh ng thông đi p do Windows phát đi lúc này thì s đ c trình ng d ng xữ ệ ẽ ượ ứ ụ ử
lý.
Hàm SendMessage() s s d ng mã hit-test code đ quy t đ nh xem lo iẽ ử ụ ể ế ị ạ
thông đi p chu t nào mà cho phát sinh. Khi hit-test code b ng HTCLIENT thì m tệ ộ ằ ộ
thông đi p vùng client s đ c phát sinh còn t t c các hit-test code khác s phát sinhệ ẽ ượ ấ ả ẽ
ra nh ng thông đi p chu t vùng non-client.ữ ệ ộ

Tr c khi SendMessage() tr v m t thông đi p chu t cho ch ng trìnhướ ả ề ộ ệ ộ ươ
c a ta thì có m t vi c mà hàm này ph i thi hành: nó ph i b o đ m là hình dáng cursorủ ộ ệ ả ả ả ả
phù h p v trí hi n th i c a mouse. Mu n th nó ph i g i đi m t thông đi p khácợ ị ệ ờ ủ ố ế ả ở ộ ệ
cho th t c c a s WM_GETCURSOR. T ng t nh thông đi pủ ụ ử ổ ươ ự ư ệ
WM_NCHITTEST đa s ch ng trình ph t l thông đi p này và giao choố ươ ớ ờ ệ
DefWindowProc() th c hi n. Mã hit-test code đ c cho trong byte th p c aự ệ ượ ở ấ ủ
thông s lParam đ cho DefWindowProc() bi t mà thi t đ t hình dáng c a con tr .ố ể ế ế ặ ủ ỏ
Hai thông đi p WM_NCHITTEST và WM_SETCURSOR bao gi c ng điệ ờ ũ
tr c m t thông đi p chu t. Vì Windows ph i tìm ra xem v trí cursor hi n ướ ộ ệ ộ ả ị ệ ở
trong vùng client hay vùng non-client đ phát ra thông đi p vùng client hay thông đi pể ệ ệ
vùng non-client m t cách thích h p. M t khi đã đ c nh n di n thì Windows ph iộ ợ ộ ượ ậ ệ ả
đ m b o là ng i s d ng nh n đ c hình dáng cursor thích h p.ả ả ườ ử ụ ậ ượ ợ
Windows cho phép đ t message hook đ thay đ i dòng ch y các thông đi p.ặ ể ổ ả ệ
M t WH_GETMESSAGE hook có th thay đ i dòng ch y c a b t c thông đi pộ ể ổ ả ủ ấ ứ ệ
chu t c a vùng client ho c vùng non-client. Khi GetMessage() s n sàng đem m tộ ủ ặ ẵ ộ
thông đi p vào ch ng trình c a ta thì nó s g i hook xem có thay đ i gì khôngệ ươ ủ ẽ ọ ổ
tr c khi thông đi p đ c chuy n cho ch ng trình.ướ ệ ượ ể ươ
Khi GetMessage() đã đ a thông đi p vào ch ng trình r i thì thông đi p sư ệ ươ ồ ệ ẽ
đ c trao tr c ti p cho th t c c a s thích h p b i hàm DispatchMessage(). Bâyượ ự ế ủ ụ ử ổ ợ ở
gi thông đi p đã n m trong th t c c a s .ờ ệ ằ ủ ụ ử ổ
5 - Th t c c a s :ủ ụ ử ổ
H n 20 thông đi p c a Windows v chu t (tr WM_NCHITTEST) thì có 10ơ ệ ủ ề ộ ừ
thông đi p thu c vùng non-client do DefWindowProc() gi i quy t. Hai thông sệ ộ ả ế ố
wParam, lParam c a th t c c a s s cho bi t thông tin v thông đi p. Tr c aủ ủ ụ ử ổ ẽ ế ề ệ ị ủ
hai thông s lParam và wParam đ u t ng t nhau cho các thông đi p chu t trênố ề ươ ự ệ ộ
vùng client.
Tr c a thông s lParam ch a v trí cursor theo t a đ c a vùng client. T aị ủ ố ứ ị ọ ộ ủ ọ
đ này cho origin v góc upper-left c a vùng client v i đ n v tính là pixel. Tr x n mộ ề ủ ớ ơ ị ị ằ
word th p còn y n m word cao c a lParam.ở ấ ằ ở ủ
Tr c a wParam là m t lô c hi u mô t tr ng thái c a các nút chu t c ng nhị ủ ộ ờ ệ ả ạ ủ ộ ũ ư

tr ng thái các nút <Ctrl>, <Shift>ạ
6 – DefWindowProc():
i v i chu t thì DefWindowProc() không quan tâm đ n nh ng thông đi pĐố ớ ộ ế ữ ệ
thu c vùng client mà ch quan tâm đ n nh ng thông đi p thu c vùng non-client.ộ ỉ ế ữ ệ ộ
DefWindowProc() có nhi m v cung c p m t giao di n chung cho bàn phímệ ụ ấ ộ ệ
và con chu t b ng cách d ch ph n nh p li u t bàn phím ho c con chu t thành cácộ ằ ị ầ ậ ệ ừ ặ ộ
l nh h th ng (system command) và cho hi n lên nh các thông đi pệ ệ ố ệ ư ệ
WM_SYSCOMMAND. Cu i cùng DefWindowProc() gi i quy t các thông đi pố ả ế ệ
WM_NCHITTEST và WM_SETCURSOR cung c p tr c cho các thông đi pấ ướ ệ
chu t khác.ộ
Ch ng 2:ươ
TÌM HIỂU VỀ HOOKS
TÌM HIỂU VỀ HOOKS
Hook là m t c ch c c m nh cho phép ta cài đ t m t th t c đ đi u khi n ho cộ ơ ế ự ạ ặ ộ ủ ụ ể ề ể ặ
ch n h ng các thông đi p tr c khi các thông đi p này t i đ c n i ti p nh n.ậ ứ ệ ướ ệ ớ ượ ơ ế ậ
Hay nói m t cách khác hook là m t đi m trong k thu t message-handling hộ ộ ể ỹ ậ ệ
th ng, n i mà m t ng d ng có th đ t m t th t c đ qu n lý s l u thông c a cácố ơ ộ ứ ụ ể ặ ộ ủ ụ ể ả ự ư ủ
thông đi p trong h th ng và x lý m t ki u thông báo nào đó tr c khi chúng t i đ cệ ệ ố ử ộ ể ướ ớ ượ
th t c c a s đích.ủ ụ ử ổ
Do có kh n ng can thi p m nh nên hook có xu h ng làm ch m l i hả ă ệ ạ ướ ậ ạ ệ
th ng vì chúng làm t ng s l ng các ho t đ ng c a h th ng đ i v i m i thôngố ă ố ượ ạ ộ ủ ệ ố ố ớ ỗ
đi p. Ch đ t hook khi th c s c n thi t và d b chúng khi không c n đ n.ệ ỉ ặ ự ự ầ ế ỡ ỏ ầ ế
1 - Chu i hook:ỗ
H th ng cho phép nhi u ki u hook khác nhau: m i ki u cung c p vi c truyệ ố ề ể ỗ ể ấ ệ
xu t t i m t khía c nh khác nhau c a k thu t message-handling. Ch ng h n,ấ ớ ộ ạ ủ ỹ ậ ẳ ạ
m t ng d ng có th s d ng hook WM_MOUSE đ qu n lý nh ng thông đi pộ ứ ụ ể ử ụ ể ả ữ ệ
chu t trong lu ng thông đi p.ộ ồ ệ
H th ng duy trì m t chu i hook riêng l đ i v i m i ki u hook. M t chu iệ ố ộ ỗ ẻ ố ớ ỗ ể ộ ỗ
hook là m t danh sách các pointer ch t i các hàm callback application-defined đ cộ ỉ ớ ặ
bi t mà nh ng hàm này g i các th t c hook. Khi m t thông đi p x y ra là nó đã đ cệ ữ ọ ủ ụ ộ ệ ả ượ

t ch c v i m t ki u hook c th , h th ng chuy n thông đi p t i m i th t cổ ứ ớ ộ ể ụ ể ệ ố ể ệ ớ ỗ ủ ụ
hook có m t trong chu i hook, theo tr t t cái n sau cái kia. Ho t đ ng c a m tặ ỗ ậ ự ọ ạ ộ ủ ộ
th t c hook có th ph thu c vào ki u hook mà nó liên quan. Các th t c hook choủ ụ ể ụ ộ ể ủ ụ
m t vài ki u hook có th ch qu n lý nh ng thông đi p; nh ng cái khác có th thayộ ể ể ỉ ả ữ ệ ữ ể
đ i nh ng thông đi p hay d ng s phát tri n c a nó trong chu i, ng n ch n chúngổ ữ ệ ừ ự ể ủ ỗ ă ặ
tìm t i th t c hook k ti p hay c a s cu i cùng (đích).ớ ủ ụ ế ế ử ổ ố
2 – Th t c hook:ủ ụ
có đ c s ti n l i c a m t lo i hook chi ti t, ng i l p trình cung c pĐể ượ ự ệ ợ ủ ộ ạ ế ườ ậ ấ
m t th t c hook và s d ng hàm ộ ủ ụ ử ụ SetWindowsHookEx đ đ t nó vào trong chu iể ặ ỗ
hook. M t th t c hook có cú pháp:ộ ủ ụ
- LRESULT CALLBACK HookProc (
Int nCode,
WPARAM wParam,
LPARAM lParam
);

×