1) Hàm InvalidateRect:
Hàm InvalidateRect c ng m t hình ch nh t vào m t vùng c p nh t c a c aộ ộ ữ ậ ộ ậ ậ ủ ử s . Vùng c p nh t đ i di n cho vùng client c a c a s ph i đ c v l i.ổ ậ ậ ạ ệ ủ ử ổ ả ượ ẽ ạ
- Cú pháp:
void InvalidateRect(hwnd, lprc, fErase)
HWND hwnd;
const RECT FAR* lprc;
BOOL fErase;
-Thơng s :ố
hwnd c a s mà vùng c p nh t c a nĩ thay đ i ử ổ ậ ậ ủ ổ
lprc ch t i đ a ch c u trúc RECT ch a t a đ client c a hình chỉ ớ ị ỉ ấ ứ ọ ộ ủ ữ nh t đ c c ng thêm vào vùng c p nh t. N u NULL thì tồn bậ ượ ộ ậ ậ ế ộ vùng client đ c c ng vào vùng c p nh tượ ộ ậ ậ
fErase xác đ nh cĩ hay khơng cĩ background trong vùng c p nh t ị ở ậ ậ bị xĩa khi vùng c p nh t đ c x lý. N u TRUE thì backgroundậ ậ ượ ử ế b xĩa khi BeginPaint đ c g i, n u NULL thì ị ượ ọ ế background v n khơng thay đ i. ẫ ổ
- Giá tr tr v : hàm khơng tr v giá tr nào c .ị ả ề ả ề ị ả
2) Hàm InvalidateRgn:
Hàm InvalidateRgn c ng m t vùng vào vùng c p nh t c a c a s . Vùng c pộ ộ ậ ậ ủ ử ổ ậ nh t đ i di n cho vùng client c a c a s ph i đ c v l i.ậ ạ ệ ủ ử ổ ả ượ ẽ ạ
- Cú pháp:
void InvalidateRgn(hwnd, hrgn, fErase) HWND hwnd;
HRGN hrgn; BOOL fErase;
- Thơng s :ố
hwnd c a s mà vùng c p nh t c a nĩ thay đ i ử ổ ậ ậ ủ ổ
hrgn vùng đ c c ng vào vùng c p nh t. Vùng ph i cĩ t a đ ượ ộ ậ ậ ả ọ ộ client. N u NULL thì tồn vùng client đ c c ng vào vùng ế ượ ộ c p nh t.ậ ậ
fErase xác đ nh cof1 hay khơng background b xĩa khi vùng c p nh t ị ị ậ ậ đ c x lý. N u TRUE thì background b xĩa khiượ ử ế ị BeginPaint đ c g i. N u FALSE thì background v nượ ọ ế ẫ khơng đ i. ổ
- Giá tr tr v : hàm khơng tr v giá tr gì.ị ả ề ả ề ị
3) Hàm UpdateWindow:
Hàm c p nh t vùng client c a c a s b ng cách g i m t thơng đi pậ ậ ủ ử ổ ằ ở ộ ệ WM_PAINT tr c ti p t i c a s n u vùng c p nh t cho c a s là khơng tr ng.ự ế ớ ử ổ ế ậ ậ ử ổ ố Hàm g i thơng đi p WM_PAINT tr c ti p t i th t c c a s c a c a s b quaở ệ ự ế ớ ủ ụ ử ổ ủ ử ổ ỏ hàng ng d ng. N u vùng c p nh t tr ng thì khơng cĩ thơng đi p nào đ c g i.ứ ụ ế ậ ậ ố ệ ượ ở
- Cú pháp:
void UpdateWindow(hwnd) HWND hwnd; - Thơng s :ố
hwnd c a s c n c p nh tử ổ ầ ậ ậ - Giá tr tr v : hàm khơng tr v giá trị ả ề ả ề ị
4 – Hàm t hook SetWindowsHookEx:đặ
- Hàm SetWindowsHookEx cài đ t m t th t c hook đ nh ngh a ng d ng vàoặ ộ ủ ụ ị ĩ ứ ụ m t chu i hook. Cài đ t th t c hook đ qu n lý h th ng cho ki u s ki n nào đĩ.ộ ỗ ặ ủ ụ ể ả ệ ố ể ự ệ Nh ng s ki n này đ c t ch c v i c thread đ c bi t hay v i c t t c threadữ ự ệ ượ ổ ứ ớ ả ặ ệ ớ ả ấ ả trong h th ng.ệ ố
- Cú pháp:
HHOOK SetWindowsHookEx(
Int idHook, // ki u hook đ cài đ tể ể ặ HOOKPROC lpfn, // đ a ch c a th t c hookị ỉ ủ ủ ụ
HINSTANCE hMod, // handle ch t i th hi n c a ng d ngỉ ớ ể ệ ủ ứ ụ DWORD dwThreadId // nh n d ng c a thread đ đ t hookậ ạ ủ ể ặ );
- Các thơng s :ố
Idhook ki u th t c hook đ c đ t, g m các giá tr sau:ể ủ ụ ượ ặ ồ ị
WH_CALLWNDPROC đ t m t th t c hook qu n lý các thơng đi p tr c lúcặ ộ ủ ụ ả ệ ướ h th ng g i chúng t i c a s đích.ệ ố ở ớ ử ổ
WH_CALLWNDPROCRET đ t m t th t c hook qu n lý các thơng đi p sauặ ộ ủ ụ ả ệ khi chúng đ c x lý b i th t c c a s đích.ượ ử ở ủ ụ ử ổ
WH_CBT đ t m t th t c hook nh n nh ng thơng báo cĩ ích t i ng d ngặ ộ ủ ụ ậ ữ ớ ứ ụ hu n luy n trên c s tính tốn (CBT).ấ ệ ơ ở
WH_DEBUG đ t m t th t c hook cĩ ích cho vi c debug nh ng th t cặ ộ ủ ụ ệ ữ ủ ụ hook khác.
WH_FOREGROUNDIDLE đ t m t th t c hook s đ c g i khi threadặ ộ ủ ụ ẽ ượ ọ foreground c a ng d ng s tr thành khơng dùng đ n. Hook này cĩ ích cho ho tủ ứ ụ ẽ ở ế ạ đ ng nh ng nhi m v (task) đ u tiên th p trong th i gian khơng đ c dùng đ n.ộ ữ ệ ụ ộ ư ấ ờ ượ ế
WH_GETMESSAGE đ t m t th t c hook qu n lý các thơng đi p đ c postặ ộ ủ ụ ả ệ ượ t i hàng thơng đi p.ớ ệ
WH_JOURNALPLAYBACK đ t m t th t c hook post nh ng thơng đi pặ ộ ủ ụ ữ ệ đ c ghi tr c đĩ b i th t c hook WH_JOURNALRECORD.ượ ướ ở ủ ụ
WH_JOURNALRECORD đ t m t th t c hook ghi nh ng thơng đi p đ uặ ộ ủ ụ ữ ệ ầ vào đ c post t i hàng thơng đi p h th ng. Hook này cĩ ích cho vi c ghi các macro.ượ ớ ệ ệ ố ệ
WH_KEYBOARD đ t m t th t c hook qu n lý các thơng đi p keystroke.ặ ộ ủ ụ ả ệ WH_KEYBOARD_LL Windows NT: đ t m t th t c hook qu n lý nh ngặ ộ ủ ụ ả ữ s ki n nh p vào t keyboard m c th p.ự ệ ậ ừ ứ ấ
WH_MOUSE đ t m t th t c hook qu n lý các thơng đi p chu t.ặ ộ ủ ụ ả ệ ộ
WH_MOUSE_LL Windows NT: đ t m t th t c hook qu n lý nh ng sặ ộ ủ ụ ả ữ ự ki n đ u vào chu t m c th p.ệ ầ ộ ứ ấ
WH_MSGFILTER đ t m t th t c hook qu n lý các thơng đi p đ c k t sinhặ ộ ủ ụ ả ệ ượ ế nh là m t k t qu cu s ki n đ u vào trong dialog box, message box, menuư ộ ế ả ả ự ệ ầ ở hay scroll bar.
WH_SHELL đ t m t th t c hook qu n lý các thơng đi p nh n thơng báo h uặ ộ ủ ụ ả ệ ậ ữ ích đ shell các ng d ng.ể ứ ụ
WH_SYSMSGFILTER đ t m t ng d ng các thơng đi p đ c k t sinh nh làặ ộ ứ ụ ệ ượ ế ư k t qu c a m t s ki n đ u vào trong dialog box, message box, menu hayế ả ủ ộ ự ệ ầ ở scroll bar. Th t c hook qu n lý nh ng thơng đi p này cho t t c các ng d ngủ ụ ả ữ ệ ấ ả ứ ụ trong h th ng.ệ ố
lpfn tr t i th t c hook. N u dwThreadId b ng 0 hay đ c t danh hi uỏ ớ ủ ụ ế ằ ặ ả ệ m t thread đ c t o ra b i m t quá trình khác, lpfn ph i ch t i m t th t c hookộ ượ ạ ở ộ ả ỉ ớ ộ ủ ụ trong m t DLL. Cịn khơng, lpfn cĩ th tr t i m t th t c hook trong code đ cộ ể ỏ ớ ộ ủ ụ ươ t ch c v i quá trình hi n th i.ổ ứ ớ ệ ờ
hMode handle ch t i DLL ch a th t c hook đ c tr t i b i lpfn. hModeỉ ớ ứ ủ ụ ượ ỏ ớ ở ph i đ c đ t NULL n u dwThread đ c t m t thread đ c t o b i quá trình hi nả ượ ặ ế ặ ả ộ ượ ạ ở ệ hành và n u th t c hook trong code đ c t ch c v i quá trình hi n hành.ế ủ ụ ở ượ ổ ứ ớ ệ
dwThreadId đ c t danh hi u c a thread v i th t c hook đã đ c t ch c,ặ ả ệ ủ ớ ủ ụ ượ ổ ứ n u là 0 thì th t c hook đ c t ch c v i t t c các thread đang t n t i.ế ủ ụ ượ ổ ứ ớ ấ ả ồ ạ
Giá tr tr v : là handle ch t i th t c hook n u thành cơng và NULL n u th tị ả ề ỉ ớ ủ ụ ế ế ấ b i.ạ
- Ghi chú: l i cĩ th x y ra n u thơng s hMode là NULL và dwThreadId = 0ỗ ể ả ế ố hay đ c t danh hi u c a m t thread đ c t o ra b i m t quá trình khác.ặ ả ệ ủ ộ ượ ạ ở ộ
T m v c c a hook ph thu c vào ki u hook. M t vài hook cĩ th đ c đ tầ ự ủ ụ ộ ể ộ ể ượ ặ ch v i t m v c h th ng, nh ng hook khác c ng đ c đ t ch cho m t thread đ cỉ ớ ầ ự ệ ố ữ ũ ượ ặ ỉ ộ ặ bi t, đây là danh sách:ệ
Hook T 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 m t lo i hook đã đ c t thì hook thread đ c g i tr c r i m i đ n hookớ ộ ạ ặ ả ượ ọ ướ ồ ớ ế h th ng. Hook h th ng là nh ng tài nguyên đ c chia s và khi đ t m t cái s nhệ ố ệ ố ữ ượ ẻ ặ ộ ẽ ả h ng lên t t c các ng d ng. T t c các hàm hook h th ng ph i trong các thưở ấ ả ứ ụ ấ ả ệ ố ả ở ư vi n. Hook h th ng nên đ c x lý cho nh ng ng d ng cĩ m c đích đ c bi t hayệ ệ ố ượ ử ữ ứ ụ ụ ặ ệ đ s d ng nh là m t tr giúp (aid) đ c bi t trong khi debug ng d ng. Các thể ử ụ ư ộ ợ ặ ệ ứ ụ ư vi n khơng c n hook thì nên g b th t c hook.ệ ầ ở ỏ ủ ụ
5 - Hàm WindowFromPoint:
- Hàm này l y handle c a c a s ch a đi m đã đ c xác đ nh.ấ ủ ử ổ ứ ể ượ ị - Cú pháp:
HWND WindowFromPoint ( POINT Point // c u trúc đi mấ ể );
- Thơng s :ố
Point : đi m đ c ki m traể ượ ể
- Giá tr tr v : Là m t handle c a c a s ch a đi m. N u khơng cĩ c a sị ả ề ộ ủ ử ổ ứ ể ế ử ổ nào ch a đi m đĩ thì giá tr tr v là NULL. N u đi m n m trong đi u khi n text t nhứ ể ị ả ề ế ể ằ ề ể ĩ (static text control) thì giá tr tr v là handle c a c a s n m bên d i đi u khi nị ả ề ủ ử ổ ằ ướ ề ể text t nh.ĩ
- Ghi chú: Hàm WindowFromPoint khơng l y m t handle c a m t c a s bấ ộ ủ ộ ử ổ ị che hay khơng ho t d ng đ c, ngay c n u đi m trong c a s . M t ng d ngạ ộ ượ ả ế ể ở ử ổ ộ ứ ụ s s d ng hàm ChildWindowFromPoint cho vi c tìm ki m khơng cĩ gi i h n.ẽ ử ụ ệ ế ớ ạ Hàm này yêu c u t i thi u là Windows 95, Header đ c khai báo trong winuser.h, sầ ố ể ượ ử d ng th vi n user32.libụ ư ệ
6 – Hàm ChildWindowFromPoint:
- Hàm ChildWindowFromPoint xác đ nh rõ nh ng c a s con nào thu c v m tị ữ ử ổ ộ ề ộ c a s cha m ch a đi m đã cho. ử ổ ẹ ứ ể
- Cú pháp:
HWND ChildWindowFromPoint (
HWND hWndParent, // handle c a c a s cha mủ ử ổ ẹ POINT Point // c u trúc t a đ đi mấ ọ ộ ể
); - Thơng s :ố
hWndParent Handle c a c a s cha m . ủ ử ổ ẹ
Point C u trúc POINT đ nh ngh a t a đ client c a đi m đ cấ ị ĩ ọ ộ ủ ể ượ ki m tra. ể
- Giá tr tr v : Là handle c a c a s con ch a đi m contains the point ngayị ả ề ủ ử ổ ứ ể c trong tr ng h p c a s con b che hay khơng th ho t đ ng hidden orả ườ ợ ử ổ ị ể ạ ộ disabled. N u đi m n m ngồi c a s cha m thì giá tr tr v là NULL. N u đi mế ể ằ ử ổ ẹ ị ả ề ế ể trong c a s cha m nh ng khơng trong b t k c a s con nào thì tr v
ở ử ổ ẹ ư ở ấ ỳ ử ổ ả ề
handle c a c a s cha m . ủ ử ổ ẹ
- Ghi chú: H th ng duy trì danh sách n i, ch a handle các c a s con đ c tệ ố ộ ứ ử ổ ượ ổ ch c b ng m t c a s cha m . Th t các handle trong danh sách ph thu c vàoứ ằ ộ ử ổ ẹ ứ ư ụ ộ tr t t Z c a nh ng c a s con. N u cĩ nhi u h n m t c a s con ch a đi m thìậ ự ủ ữ ử ổ ế ề ơ ộ ử ổ ứ ể h th ng tr v handle c a c a s đ u tiên trong danh sách mà cĩ ch a đi m. Hàmệ ố ả ề ủ ử ổ ầ ứ ể này địi h i t i thi u Windows 95, Header: đ c khai báo trong winuser.h, s d ngỏ ố ể ượ ử ụ Import Library user32.lib.
7 – Hàm ChildWindowFromPointEx:
- Hàm ChildWindowFromPointEx xác đ nh rõ nh ng c a s con thu c v c aị ữ ử ổ ộ ề ử s cha m ch a đi m. Hàm cĩ th ph t l c a s con khơng nhìn th y, khơng thổ ẹ ứ ể ể ớ ờ ử ổ ấ ể ho t đ ng đ c và trong su t.ạ ộ ượ ố
- Cú pháp:
HWND ChildWindowFromPointEx(
POINT pt, // c u trúc t a đ đi mấ ọ ộ ể UINT uFlags // nh ng c b quãngữ ờ ỏ );
- Thơng s :ố
hwndParent Handle c a c a s cha m . ủ ử ổ ẹ
pt c u trúc POINT đ nh ngh a t a đ client c a đi m đ c ấ ị ĩ ọ ộ ủ ể ượ ki m tra. ể
uFlags cho bi t nh ng c a s con b b , cĩ th k t h p các giá ế ữ ử ổ ị ỏ ể ế ợ tr sau: ị
Giá trị Ý ngh aĩ
CWP_ALL Khơng b b t k c a s con nàoỏ ấ ỳ ử ổ
CWP_SKIPINVISIBLE B nh ng c a s con khơng nhìn th yỏ ữ ử ổ ấ CWP_SKIPDISABLED B nh ng c a s con khơng th ho t đ ngỏ ữ ử ổ ể ạ ộ CWP_SKIPTRANSPARENT B nh ng c a s con trong su tỏ ữ ử ổ ố
- Giá tr tr v : Là handle c a c a s con đ u tiên ch a đi m và b t g p tiêuị ả ề ủ ử ổ ầ ứ ể ắ ặ chu n (critia) đ c đ c t b i ẩ ượ ặ ả ở uFlags. N u đi m trong c a s cha m nh ngế ể ở ử ổ ẹ ư khơng trong b t k c a s con nào b t g p tiêu chu n thì giá tr tr v là handleở ấ ỳ ử ổ ắ ặ ẩ ị ả ề c a c a s cha m . N u đi m n m ngồi c a s cha m hay n u hàm th t b i thìủ ử ổ ẹ ế ể ằ ử ổ ẹ ế ấ ạ giá tr tr v là NULL.ị ả ề
- Ghi chú: H th ng duy trì m t danh sách n i ch a handle c a nh ng c a sệ ố ộ ộ ứ ủ ữ ử ổ con đ c t ch c b ng c a s cha m . Th t c a các handle trong danh sách phượ ổ ứ ằ ử ổ ẹ ứ ự ủ ụ thu c vào tr t t Z c a nh ng c a s con. N u cĩ nhi u h n m t c a s conộ ậ ự ủ ữ ử ổ ế ề ơ ộ ử ổ ch a đi m thì h th ng tr v handle c a c a s đ u tiên trong danh sách ch aứ ể ệ ố ả ề ủ ử ổ ầ ứ đi m và b t g p tiêu chu n trong ể ắ ặ ẩ uFlags. Hàm này địi h i t i thi u Windows 95,ỏ ố ể Header: đ c khai báo trong winuser.h, s d ng Import Library user32.lib.ượ ử ụ
8 - Hàm GetWindowText:
- Hàm GetWindowText sao chép text thanh tiêu đ c a c a s đã đ c đ c tề ủ ử ổ ượ ặ ả (n u nĩ cĩ m t) vào m t vùng đ m. N u c a s đ c đ c t là m t đi u khi n thìế ộ ộ ệ ế ử ổ ượ ặ ả ộ ề ể text c a đi u khi n đ c sao chép. Tuy nhiên, GetWindowText khơng th l y textủ ề ể ượ ể ấ c a đi u khi n trong m t ng d ng khác.ủ ề ể ộ ứ ụ
int GetWindowText(
HWND hWnd, // handle c a c a s hay đi u khi n cĩ ch a textủ ử ổ ề ể ứ LPTSTR lpString, // đ a ch c a vùng đ m cho textị ỉ ủ ệ
int nMaxCount // s c c đ i nh ng ký t đ sao chépố ự ạ ữ ự ể );
- Thơng s :ố
hWnd Handle c a c a s hay đi u khi n cĩ ch a text. ủ ử ổ ề ể ứ
lpString Pointer ch t i vùng đ m s nh n text. ỉ ớ ệ ẽ ậ
nMaxCount s l ng c c đ i các ký t chép t i vùng đ m tính luơn ố ượ ự ạ ự ớ ệ c ký t , NULL. N u đo n text v t quá gi i h n này ả ự ế ạ ượ ớ ạ thì nĩ s b c t b t. ẽ ị ắ ớ
- Giá tr tr v : N u thành cơng thì tr v đ dài các ký t trong chu i đ c chépị ả ề ế ả ề ộ ự ỗ ượ khơng tính ký t r ng cu i chu i. N u c a s khơng cĩ thanh tiêu đ hay đo n text,ự ỗ ố ỗ ế ử ổ ề ạ hay n u thanh tiêu đ r ng hay n u handle c a c a s ho c thanh tiêu đ khơngế ề ỗ ế ủ ử ổ ặ ề h p l thì giá tr tr v là zero. Hàm này khơng th l y đo n text c a m t editợ ệ ị ả ề ể ấ ạ ủ ộ control trong ng d ng khác.ứ ụ
- Ghi chú: N u c a s đích thu c s h u b i quá trình hi n hành, hàmế ử ổ ộ ở ữ ở ệ GetWindowText t o nên thơng đi p WM_GETTEXT đ g i t i đi u khi n hayạ ệ ể ở ớ ề ể c a s đ c đ c t . N u c a s đích đ c s h u b i m t quá trình khác và cĩ m tử ổ ượ ặ ả ế ử ổ ượ ở ữ ở ộ ộ đ u đ (caption) thì hàm GetWindowText l y ph n text caption c a c a s . N uầ ề ấ ầ ủ ử ổ ế c a s khơng cĩ caption thì giá tr tr v là m t chu i r ng. Hàm này địi h i t i thi uử ổ ị ả ề ộ ỗ ỗ ỏ ố ể Windows 95, Header: đ c khai báo trong winuser.h, s d ng Import Libraryượ ử ụ user32.lib.
9 - Hàm MouseProc:
Th t c hook MouseProc là m t hàm callback đ nh ngh a th vi n hay đ nhủ ụ ộ ị ĩ ư ệ ị ngh a ng d ng s d ng hàm SetWindowsHookEx. H th ng g i hàm này b t cĩ ứ ụ ử ụ ệ ố ọ ấ ứ khi nào m t ng d ng g i hàm GetMessage hay PeekMessage và cĩ m t thơng đi pộ ứ ụ ọ ộ ệ chu t đ c x lý.ộ ượ ử
Ki u HOOKPROC đ nh ngh a m t pointer tr t i hàm callback. MouseProc làể ị ĩ ộ ỏ ớ m t placeholder cho tên hàm đ nh ngh a ng d ng hay tên hàm đ nh ngh a th vi n.ộ ị ĩ ứ ụ ị ĩ ư ệ
LRESULT CALLBACK MouseProc ( Int nCode, // hook code
WPARAM wParam, // danh hi u thơng đi pệ ệ LPARAM lParam // t a đ chu tọ ộ ộ
); - Thơng s :ố
nCode m t code th t c hook s d ng đ quy t đ nh làm th nào đ ộ ủ ụ ử ụ ể ế ị ế ể x lý thơng đi p, cĩ th cĩ giá tr :ử ệ ể ị
Giá trị Ý ngh aĩ
HC_ACTION wParam và lParam ch a thơng tin m t thơng đi p ứ ộ ệ chu tộ
HC_NOREMOVE wParam và lParam ch a thơng tin m t thơng ứ ộ đi p chu t, và thơng đi p chu t khơng b xĩaệ ộ ệ ộ ị