Hook trong Windows

Một phần của tài liệu phần mềm hỗ trợ người khiếm thị học tiếng anh (Trang 115)

3 TỔNG QUAN VỀ ACTIVE ACCESSIBILITY VÀ HOOK

3.7 Hook trong Windows

Hook là một cơ chế trong lập trình sự kiện cho phép ứng dụng cĩ thể cài đặt một hàm giám sát vào quá trình lưu chuyển các thơng điệp đểứng dụng cĩ thể chặn và xử lý trước khi nĩ đến được cửa sổđích.

Thủ tục con được cài đặt tại một vị trí hook được gọi là hàm lọc (filter fucntion). Hàm lọc này tương tự như một thủ tục trong cửa sổđể nhận và xử lý thơng điệp. Khi những hàm lọc này được đặt vào quá trình lưu chuyển các thơng điệp tại một điểm hook bằng cách sử dụng hàm API SetWindowHookEx, gọi là cài đặt một hook. Điểm hook là một vị trí do hệ thống định nghĩa trong quá trình lưu chuyển thơng điệp mà hàm lọc được cài vào đĩ. Những điểm hook này khơng thể thay đổi.

3.7.1 Các loi Hook

Cĩ 15 loại hook khác nhau tùy vào nhu cầu sử dụng : WH_CALLWNDPROC

Gọi trước khi một thơng điệp tới cửa sổđích. WM_CALLWNDPROCRET

Gọi sau khi cửa sổđích hồn thành xong việc xử lý thơng điệp. WH_CBT

Trang 116

Bắt các thơng điệp thích hợp cho người phát triển tạo các ứng dụng CBT. WH_DEBUG

Gọi mỗi khi các hàm hook khác sắp được gọi. Hàm hook này được gọi trước được dùng khi debug các hàm hook khác.

WH_FOREGROUNDIDLE

Gọi khi khơng cĩ thơng điệp nào cần xử lý trong hàng đợi thơng điệp của tiểu trình(thread) hiện tại.

WH_GETMESSAGE

Gọi lập tức trước khi những hàm API GetMessage và PeekMessage trả về một thơng điệp.

WH_JOURNALRECORD

Bắt tất cả các thơng điệp chuột và bàn phím trước khi chúng tới cửa sổđích. WH_JOURNALPLAYBACK

Thực hiện lại các thơng điệp được bắt bởi hook WH_JOURNALRECORD. WH_KEYBOARD

Bắt những thơng điệp chuyên biệt về bàn phím sau khi chúng được gởi tới hàng đợi thơng điệp của một tiểu trình nhưng trước khi chúng được xử lý bởi cửa sổđích.

WH_KEYBOARD_LL

Bắt những thơng điệp chuyên biệt về bàn phím trước khi chúng được gởi tới hàng

đợi thơng điệp của một tiểu trình. WM_MOUSE

Bắt những thơng điệp chuyên biệt về chuột sau khi chúng được gởi tới hàng đợi thơng điệp của một tiểu trình nhưng trước khi chúng được xử lý bởi cửa sổđích.

WM_MOUSE_LL

Bắt những thơng điệp chuyên biệt về chuột trước khi chúng được gởi tới hàng đợi thơng điệp của một tiểu trình.

Trang 117 WH_MSGFILTER

Được gọi bất cứ khi nào hộp thoại, hộp thơng báo, thanh cuộn, hoặc menu nhận thơng điệp. Loại hook này cũng được gọi khi người dùng bấm ALT + TAB hoặc ALT + ESC. Loại hook này nhận thơng điệp trong một tiểu trình đơn.

WH_SYSMSGFILTER

Loại hook này giống WH_MSGFILTER nhưng ở mức tồn cục. Loại hook này nhận thơng điệp từ tất cả các tiểu trình đang chạy trong hệ thống.

WH_SHELL

Được gọi khi một hành động xảy ra trên một cửa sổ cấp cao nhất.

3.7.2 Th tc Hook

Mỗi loại hook được đặt ở những vị trí khác nhau trong hệ thống thơng điệp Windows. Tất cả hook được cài bởi hệđiều hành và khơng thể di chuyển sang nơi khác trong hệ thống thơng điệp. Trong quá trình lưu chuyển những thơng điệp phải đi qua một hoặc nhiều điểm hook. Hook chỉ thật sự hữu dụng khi một hàm lọc(cịn gọi là thủ tục Hook) đính kèm vào nĩ. Khi đĩ những thơng điệp đi qua điểm hook sẽ phải qua hàm lọc trước khi tới cửa sổđích.

Dạng chung của hàm lọc :

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);

Các tham số :

• nCode : xác định hành động cần xử lý. Giá trị của nCode tùy thuộc vào loại Hook.

• wParam, lParam : chứa thơng tin của message.

Trang 118

Hình 49 Mt đim hook trong quá trình lưu chuyn thơng đip cĩ hàm lc

Tại một điểm Hook nếu cĩ nhiều ứng dụng đính kèm thủ tục Hook vào nĩ, những thủ

tục Hook này sẽ tạo thành một chuỗi mắt xích với nhau :

Hình 50 Mt đim hook cĩ 3 th tc Hook đính kèm

Hệđiều hành Windows quản lý chuỗi Hook riêng biệt cho từng loại Hook. Khi cĩ một thơng điệp xảy ra, Windows sẽ gởi thơng điệp đĩ đến thủ tục Hook đầu tiên trong chuỗi Hook cĩ loại tương ứng. Thơng điệp sẽđược chuyển lần lượt đến các thủ tục Hook kế tiếp sau đĩ.

3.7.3 Cài đặt Hook

Khi muốn giám sát các thơng điệp một ứng dụng phải cài đặt thủ tục Hook. Hàm SetWindowsHookEx sẽ cài đặt thủ tục Hook vào điểm bắt đầu của chuỗi Hook.

HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn , HINSTANCE hMod, DWORD dwThreadId);

Trang 119

Các tham s :

• idHook : loại Hook

• lpfn : con trỏ hàm tới hàm lọc đã định nghĩa trước.

• hMod : handle của module chứa hàm lọc.

• dwThreadId : ID của tiểu trình. Nếu là 0, Hook sẽ là tồn cục. Ví dụ :

Minh họa cài đặt Hook tồn cục.

HOOKPROC fnKeyboardProc; static HINSTANCE hInstDLL; static HHOOK hHook;

hInstDLL = LoadLibrary((LPCTSTR) “myKBDLL.dll”);

fnKeyboardProc = (HOOKPROC)GetProcAddress(hInstDLL, “KeyboardProc”); hHook = SetWindowsHookEx(WH_KEYBOARD, fnKeyboardProc, hInstDLL, 0); Hàm lọc :

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

{

if(nCode >=0 && nCode == HC_ACTION) {

pMsg = (MSG*)lParam;

if(pMsg->message == WM_KEYDOWN) {

MessageBox(NULL, “KeyDown”, “Hook”, 0); }

}

return CallNextHookEx(hHook, nCode, wParam, lParam); }

Sau khi thực hiện xong hàm lọc sẽ gọi hàm CallNextHookEx để chuyển đến thủ tục Hook kế tiếp trong chuỗi Hook.

LRESULT CallNextHookEx(HHOOK hHook, int code, WPARAM wParam, LPARAM lParam);

Các tham s :

Trang 120

• code, wParam, lParam : thủ tục Hook kế tiếp sẽ dựa vào các giá trị của thủ

tục Hook hiện tại này để xử lý thơng tin Hook.

Lưu ý : Thủ tục Hook cĩ thể khơng cần chuyển thơng điệp đến thủ tục Hook kế tiếp. Việc làm này cĩ thể gây những lỗi nghiêm trọng cho hệ thống.

3.7.4 G b Hook

Việc sử dụng thủ tục Hook sẽ làm giảm khả năng thực thi của hệ thống. Cho nên sau khi sử dụng Hook xong nên hủy bỏ ra khỏi hệ thống.

BOOL UnhookWindowsHookEx(HHOOK hHook);

Tham s :

• hHook : handle của hook cần hủy bỏ.

3.7.5 Phm vi Hook

Một Hook cĩ thể cài đặt để bắt thơng điệp cho một tiểu trình trong một tiến trình hoặc tất cả tiểu trình trong tất cả tiến trình đang hoạt động trong hệ thống. Phạm vi của Hook phụ thuộc vào nơi đặt nĩ (trong ứng dụng hay trong một DLL) và cách thiết lập các tham số trong hàm SetWindowsHookEx. Tham số thứ ba và thứ tư trong hàm

SetWindowsHookEx sẽ xác định phạm vi của Hook.

3.7.5.1 Hook cc b

Khi một hook chỉ bắt những thơng điệp trong một tiểu trình đơn, hook này cĩ phạm vi cục bộ. Hook này cĩ thểđặt trong một DLL nhưng thường được đặt trong ứng

dụng(EXE). Những Hook dạng cục bộ phải thiết lập tham số hMod của hàm

SetWindowsHookEx là 0, nghĩa là thủ tục Hook đặt tại một vị trí một tiểu trình bên trong

ứng dụng. Tham số dwThreadId được thiết lập bằng với định danh của tiểu trình chứa thủ

tục Hook của ứng dụng.

Các loi Hook cc b :

• WH_CALLWNDPROC

• WH_CALLWNDPROCRET

Trang 121 • WH_DEBUG • WH_FOREGROUNDIDLE • WH_GETMESSAGE • WH_KEYBOARD • WH_MOUSE • WH_MSGFILTER • WH_SHELL 3.7.5.2 Hook tồn cc

Những Hook cĩ thể bắt các thơng điệp gởi đi tới tất cả tiểu trình trong hệ thống được gọi là Hook tồn cục. Những thủ tục Hook thuộc loại này phải được chứa trong một DLL.

Để tạo Hook tồn cục, trong hàm SetWindowsHookEx đối số hMod được thiết lập là

định danh của DLL và đối số dwThreadId được thiết lập là NULL. Thiết lập đối số

dwThreadId về NULL báo cho hệ thống biết loại Hook này được cài đặt cho mọi tiểu trình

đang chạy trong các tiến trình. Nếu đối số này được lập là một ID của tiểu trình đang tồn tại thì hệ thống sẽ cài Hook này chỉ cho tiến trình này. Khi hệ thống tạo Hook này, nĩ ánh xạ DLL với định danh đã thiết lập trong đối số hMod vào mọi tiến trình đang chạy trên hệ

thống. Khi hệ thống được thơng báo cĩ một thủ hook tồn cục cần được gọi lần đầu bởi một tiểu trình, hệ thống sẽ xác định xem nếu DLL chứa thủ tục Hook đã được ánh xạ vào tiến trình chứa tiểu trình đĩ hay chưa. Nếu nĩ khơng thểđịnh vị, nĩ sẽđược ánh xạ vào trong tiến trình tại vị trí này. Điều này cho phép mỗi tiến trình cĩ sự ánh xạ riêng mã của thủ tục Hook được chứa trong DLL.

Các loi Hook tồn cc : • WH_JOURNALPLAYBACK • WH_JOURNALRECORD • WH_MOUSE_LL • WH_KEYBOARD_LL • WH_SYSMSGFILTER

Trang 122

3.7.6 Các ng dng ca Hook

• Thay đổi các thơng điệp gởi tới hộp thoại, thanh cuộn, menu, hoặc hộp thơng báo.

• Thu và thực hiện lại những hành động chuột, thao tác gõ phím tương tự như

thu lại macro trong Microsoft Excel và Microsoft Word.

• Kiểm sốt một hay nhiều thơng điệp trong ứng dụng hoặc hệ thống, và thao tác trên những thơng điệp chuyên biệt. Vd : Spy++,…

• Tạo ta những ứng dụng CBT mà nếu khơng cĩ dùng Hook thì rất khĩ khăn để

làm được.

• Tạo ra những ứng dụng test tựđộng..

Một phần của tài liệu phần mềm hỗ trợ người khiếm thị học tiếng anh (Trang 115)