Chương 10<br />
<br />
Lập trình<br />
HOOK<br />
1<br />
<br />
10.1. Cơ chế Hook trong Windows<br />
<br />
<br />
<br />
<br />
<br />
Hook là một kỹ thuật cho phép một hàm có thể nhận và xử lý các sự kiện (thông<br />
điệp, thao tác chuột, gõ phím) trước khi chúng được chuyển đến các ứng dụng.<br />
Mỗi sự kiện có thể được xử lý (Hook) bởi nhiều hàm khác nhau, các hàm này tạo<br />
nên chuỗi hàm xử lý sự kiện, gọi là hook chain, các hàm này xử lý các sự kiện theo<br />
thứ tự đã đăng ký.<br />
Minh họa cơ chế Hook theo hook chain:<br />
Hàm_1<br />
<br />
Ứng dụng App1<br />
<br />
Hàm_2<br />
Sự kiện<br />
Mouse<br />
<br />
Ứng dụng App2<br />
Hàm_3<br />
<br />
Hàm_n<br />
<br />
Ứng dụng App3<br />
<br />
Hook chain<br />
2<br />
<br />
10.1. Cơ chế Hook trong Windows<br />
Để lập trình hook cơ bản chúng ta phải thực hiện hai bước là viết hàm xử<br />
lý sự kiện và đăng ký hook.<br />
Có 2 phạm vi đăng ký hook, trong chương trình (local) và toàn bộ hệ thống<br />
(global). Đối với phạm vi local thì sự kiện chỉ bị chặn và xử lý liên quan đến<br />
chương trình, còn global sẽ bị chặn và xử lý mọi nơi trong hệ thống.<br />
Với phạm vi local chỉ cần lập trình một hàm xử lý sự kiện trong chương<br />
trình, thực hiện đăng ký cũng trong chương trình này. Đối với global thì<br />
hàm xử lý sự phải lập trình trong một môđun thư viện DLL, sau đó dùng<br />
một chương trình khác để đăng ký. Chúng ta sẽ thực hiện dạng global.<br />
Có thể khóa một sự kiện bằng cách chặn xử lý sự kiện đó và không gọi tới<br />
các hàm xử lý của hệ thống. Minh họa ở phần cơ chế hook chain.<br />
<br />
<br />
3<br />
<br />
10.2. Các bước lập trình Hook<br />
Hai bước thực hiện lập trình hook như sau:<br />
Bước 1: Xây dựng một thư viện DLL, chứa hàm xử lý sự kiện hook<br />
Bước 2: Lập chương trình đăng ký và hủy bỏ hook<br />
Chương trình<br />
Minh họa như sau:<br />
<br />
<br />
Thư viện DLL<br />
Hàm xử lý<br />
sự kiện hook<br />
<br />
Nạp thư viện DLL<br />
vào chương trình<br />
<br />
Hàm xử lý<br />
sự kiện hook<br />
<br />
Lấy địa chỉ hàm<br />
xử lý sự kiện hook<br />
Đăng ký hook<br />
Hủy bỏ đăng ký<br />
4<br />
<br />
10.3. Xây dựng DLL cho hàm Hook<br />
<br />
<br />
<br />
<br />
Có thể xây dựng hàm xử lý sự kiện hook cùng trong chương trình đăng ký, tuy<br />
nhiên nó chỉ có ảnh hưởng tới luồng trong tiến trình của chương trình. Để có ảnh<br />
hưởng tới mọi luồng chúng ta phải viết trong thư viện DLL.<br />
Mẫu hàm xử lý sự kiện hook:<br />
LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam );<br />
<br />
Các sự kiện và ý nghĩa tham số:<br />
- Sự kiện Mouse<br />
<br />
<br />
<br />
+ nCode : cho biết sự kiện chuột, HC_ACTION nếu người dùng tác động,<br />
HC_NOREMOVE nếu thông điệp được gửi bởi hàm PeekMessage.<br />
+ wParam : giá trị thông điệp chuột<br />
+ lParam : trỏ tới cấu trúc MOUSEHOOKSTRUCT gồm { POINT, HWND,... }<br />
<br />
- Sự kiện Keyboard<br />
+ nCode : cho biết sự kiện bàn phím, HC_ACTION nếu người dùng tác động,<br />
HC_NOREMOVE nếu thông điệp được gửi bởi hàm PeekMessage.<br />
+ wParam : mã phím ảo của phím được gõ, VK_...<br />
+ lParam : một số thông tin liên đến phím gõ.<br />
<br />
<br />
Hàm trả về giá trị 1 nếu muốn khóa sự kiện, ngược lại hãy gọi và trả về giá trị hàm<br />
CallNextHookEx( HHOOK, nCode, wParam, lParam);<br />
5<br />
<br />