Có bạn đặt câu hỏi gõ tiếng Việt Microsoft Word phần mềm soạn thảo văn khác hay không? Rõ ràng can thiệp vào mã Microsoft Word để sửa thành tiếng Việt muốn soạn thảo văn tiếng Việt Vậy phần mềm VietKey, VNI-TanKy lại làm điều này? Câu trả lời sử dụng Hook Trong viết này, tìm hiểu xem Hook mà làm điều thần kỳ vậy! Truớc tìm hiểu Hook , nhắc lại chút trình xử lý thông điệp hệ điều hành Windows Quá trình xử lý thông điệp Windows diễn sau : Đầu tiên từ hành động nguời dùng : click chuột, nhấn phím, hệ điều hành chuyển hành động tương ứng thành thông điệp (message) Rồi sau Windows đẩy message vào hàng đợi hệ thống (system queue) từ system queue message đuợc chuyển cho hàng đợi ứng dụng (application queue) Từ lúc ứng dụng lấy message hàng đợi ứng dụng để xử lý (thông qua vòng lặp chờ thông điệp - message loop) Hook ? Hook chế mà nhờ hàm chặn kiện (message, mouse actions, keystrokes ) trước chúng gửi đến hàng đợi ứng dụng Các hàm thực số thao tác kiện, vài trường hợp định nghĩa lại hủy bỏ kiện mà chặn Một điểm quan trọng cần lưu ý hàm gọi Windows ứng dụng Windows hỗ trợ nhiều loại hook khác nhau, loại nhắm đến việc chặn bắt loại thông điệp cụ thể Ví dụ, ứng dụng sử dụng WH_KEYBOARD để giám sát di chuyển thông điệp bàn phím hệ thống Nhờ loại hook mà chương trình can thiệp vào tạo khả gõ tiếng Việt soạn thảo văn Một loại hook khác WH_MOUSE cho phép theo dõi thông điệp liên quan đến hoạt động chuột Hình mô tả trình xử lý thông điệp Windows có sử dụng Hook Thì hình vẽ thấy rõ ràng ,một sử dụng Hook Hook đặt nằm System Queue Application Queue Cơ chế hoạt động Hook Hệ thống trì chuỗi hook (hook chain) cho loại hook Mỗi chuỗi danh sách liên kết trỏ đặt biệt, trỏ hàm callback ứng dụng có sẵn, gọi hàm hook (hàm lọc, filter function) Khi có thông điệp sinh thuộc loại hook đó, hệ thống đẩy vào hàm hook chuỗi, hàm (qua tất hook chuỗi) Công việc hàm hook phức tạp hay đơn giản tùy thuộc vào loại hook Hàm hook cho số loại giám sát, số khác sửa đổi thông điệp dừng lại việc xử lý thông điệp chuỗi hook trước chúng đến hook đến cửa sổ đích Ứng dụng Hook - Cho phép tạo chương trình hỗ trợ gõ tiếng Việt : Vietkey - Cho phép tạo chuơng trình Test tự động phần mềm (bằng cách phát sinh kiện phím, chuột giống người dùng nhập vào) - Cho phép thay đổi giao diện ứng dụng chạy - Cho phép xem phần trợ giúp ứng dụng việc nhấn phím đó, ví dụ nhấn F1 chẳng hạn - Và nhiều ứng dụng khác tùy vào trí tưởng tượng bạn !… Cài đặt Hook Giao diện lập trình ứng dụng (API) Windows cung cấp hàm để thao tác với hook : • SetWindowsHookEx • UnhookWindowsHookEx • CallNextHookEx a) Cài đặt Filter Function vào chuỗi Filter Function hook Tác vụ thực thông qua hàm SetWindowsHookEx, khai báo hàm sau : HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId); Ý nghĩa tham số : idHook: Xác định loại hook mà ta muốn cài đặt, tham số giá trị sau : • WH_CALLWNDPROC : đặt thủ tục hook quản lý thông điệp trước lúc hệ thống gởi chúng tới cửa sổ đích • WH_CALLWNDPROCRET : đặt thủ tục hook quản lý thông điệp sau chúng xử lý thủ tục cửa sổ đích • WH_CBT : đặt thủ tục hook nhận thông báo có ích tới ứng dụng huấn luyện sở tính toán (CBT) • WH_DEBUG : đặt thủ tục hook có ích cho việc debug thủ tục hook khác • WH_FOREGROUNDIDLE : đặt thủ tục hook gọi thread foreground ứng dụng trở thành không dùng đến Hook có ích cho hoạt động nhiệm vụ (task) độ ưu tiên thấp thời gian không dùng đến • WH_GETMESSAGE : đặt thủ tục hook quản lý thông điệp post tới hàng đợi thông điệp •WH_JOURNALPLAYBACK : đặt thủ tục hook post thông điệp ghi trước thủ tục hook WH_JOURNALRECORD •WH_JOURNALRECORD : đặt thủ tục hook ghi thông điệp đầu vào post tới hàng thông điệp hệ thống Hook có ích cho việc ghi macro • WH_KEYBOARD : đặt thủ tục hook quản lý thông điệp keystroke • WH_MOUSE : đặt thủ tục hook quản lý thông điệp chuột • WH_MSGFILTER: đặt thủ tục hook quản lý thông điệp kết sinh kết cuả kiện đầu vào dialog box, message box, menu hay scroll bar • WH_SYSMSGFILTER : đặt ứng dụng thông điệp kết sinh kết kiện đầu vào dialog box, message box, menu hay scroll bar Thủ tục hook quản lý thông điệp cho tất ứng dụng hệ thống Mỗi giá trị xác định loại hook mà ta muốn cài đặt, loại hook có ý nghĩa tình sử dụng khác lpfn : Địa Filter Function mà ta muốn gắn với hook hMod : Handle module chứa Filter Function Nếu ta cài đặt hook cục (nghĩa thực thi Filter Function ảnh hưởng tiến trình cài đặt hook), tham số phải NULL Còn muốn có hook với phạm vi toàn hệ thống (tức tiến trình hữu chịu ảnh hưởng Filter Function chúng ta), tham số Handle DLL chứa Filter Function dwThreadID : Định danh thread ứng với hook cài đặt Nếu tham số số khác 0, Filter Function gắn với hook gọi ngữ cảnh thread xác định Còn dwThreadID = 0, Filter Function có phạm vi toàn hệ thống, dĩ nhiên, gọi ngữ cảnh thread tồn HĐH Có thể sử dụng hàm GetCurrentThreadId để lấy handle thread muốn cài đặt hook Một hook sử dụng mức hệ thống, mức cục bộ, hai mức vừa nêu Bảng sau mô tả loại hook tầm ảnh hưởng : WH_CALLWNDPROC Thread , Global WH_CALLWNDPROCRET Thread , Global WH_CBT Thread , Global WH_DEBUG Thread , Global WH_FOREGROUNDIDLE Thread , Global WH_GETMESSAGE Thread , Global WH_JOURNALPLAYBACK Global WH_JOURNALRECORD Global WH_KEYBOARD Thread , Global WH_MOUSE Thread , Global WH_MSGFILTER Thread , Global WH_SYSMSGFILTER Global Với loại hook xác định, hook cục gọi trước, sau hook toàn cục b) Gỡ bỏ Filter Function khỏi chuỗi Filter Function hook Windows cung cấp hàm UnhookWindowsHookEx giúp thực việc Khai báo sau : BOOL UnhookWindowsHookEx( HHOOK hhk); Tham số : hhook hàm hook dỡ bỏ Đây giá trị trả vể hàm SetWindowsHookEx hàm Hook cài đặt Chú ý : Hàm UnhookWindowsHookEx phải sử dụng kết hợp với hàm SetWindowsHookEx c) Chi tiết Filter Function Filter Function hàm gắn với loại hook mà muốn cài đặt Hàm gọi hệ điều hành Windows không gọi ứng dụng, lý mà người ta thường gọi “Callback Function” Tuy nhiên , để thống mặt thuật ngữ, từ sau gọi Filter Function Tất Filter Function có dạng sau : LRESULT CALLBACK FilterFunc(int nCode, WPARAM wParam, LPARAM lParam); Ở “FilterFunc” tên hàm tượng trưng, cài đặt, Filter Function có tên theo ý người lập trình Ý nghĩa tham số truyền cho hàm : nCode : tham số thường gọi “hook code”, Filter Function sử dụng giá trị để định cách thức xử lý kiện Giá trị hook code tùy thuộc vào loại hook cụ thể, loại hook có tập hợp giá trị hook code đặc trưng riêng Có quy luật mà dường Filter Function loại hook cần tuân thủ : Khi Windows truyền cho hàm giá trị hook code âm, Filter Function không xử lý kiện mà phải gọi hàm CallNextHookEx với tham số mà hệ điều hành truyền cho Sau đó, phải trả giá trị trả hàm CallNextHookEx wParam, lParam: Đây thông tin cần thiết cho Filter Function trình xử lý kiện Các giá trị có ý nghĩa khác tuỳ thuộc vào loại hook Ví dụ , Filter Function gắn với hook WH_KEYBOARD nhận mã phím ảo (Virtual-Key Code) từ wParam, đồng thời có từ lParam thông tin mô tả trạng thái bàn phím kiện gõ phím xảy d) Gọi Filter Function chuỗi Filter Function Khi hook cài đặt, Windows gọi hàm chuỗi Filter Function, kể từ thời điểm này, trách nhiệm Windows không Filter Function hành phải đảm bảo với hệ thống có lời gọi đến hàm chuỗi Filter Function Bởi lẽ, có ứng dụng khác cài đặt loại hook để thi hành số tác vụ đó, ta không cho Filter Function ứng dụng tham gia xử lý kiện, có vấn đề rắc rối xảy Vấn đề trở nên nghiêm trọng ứng dụng chương trình thuộc hệ thống, rõ ràng đảm bảo cho an toàn hệ thống Để giải vấn đề trên, sử dụng hàm CallNextHookEx, khai báo sau : LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ); hhk : handle hook hành, giá trị lấy từ hàm SetWindowsHookEx cài đặt hook nCode : định hook code để gởi đến hook Hàm xử lý hook dùng giá trị để định xử lý thông điệp gởi từ hook wParam: định 16 bits thông tin mở rộng thông điệp lParam: định 32 bits thông tin mở rộng thông điệp Giá trị trả : giá trị trả kết trình xử lý tùy thuộc vào thông số nCode Trong số tình huống, Filter Function hành không muốn chuyển kiện cho Filter Function khác chuỗi Lúc này, loại hook cài đặt cho phép huỷ bỏ kiện, Filter Function có định hủy bỏ, gọi hàm CallNextHookEx Chương trình minh họa Để hiểu rõ Hook ,các bạn xem ví dụ đơn giản sử dụng Hook Trong ví dụ cài đặt Hook ,cho phép đọc thông tin menu bar chuẩn chương trình ứng dụng lưu thông tin thành tập tin resource (để sau ta dễ dàng sử dụng chương trình mình!) Trong ví dụ sử dụng Hook WH_GETMESSAGE để chặn bắt thông điệp gửi đến hàng đợi thông điệp Và chương trình bắt thông điệp WM_NCLBUTTONDOWN (thông điệp đuợc phát sinh click chuột lện tiêu đề cửa sổ) , chương trình cho mở hộp thoại Save As nguời dùng chọn đường dẫn đặt tên cho file resource tạo Và lúc chuơng trình lưu toàn nội dung menubar xuống thành file resource mà đặt tên * Trong ví dụ ta muốn lấy thông tin menu bar tất ứng dụng Windows nên ta phải sử dụng tập tin DLL để lập Hook loại toàn cục (còn hook loại cục cho phép chặn thông điệp nội ứng dụng có cài đặt Hook mà thôi) ... UnhookWindowsHookEx( HHOOK hhk); Tham số : hhook hàm hook dỡ bỏ Đây giá trị trả vể hàm SetWindowsHookEx hàm Hook cài đặt Chú ý : Hàm UnhookWindowsHookEx phải sử dụng kết hợp với hàm SetWindowsHookEx... loại hook xác định, hook cục gọi trước, sau hook toàn cục b) Gỡ bỏ Filter Function khỏi chuỗi Filter Function hook Windows cung cấp hàm UnhookWindowsHookEx giúp thực việc Khai báo sau : BOOL UnhookWindowsHookEx(... Function hook Tác vụ thực thông qua hàm SetWindowsHookEx, khai báo hàm sau : HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId); Ý nghĩa tham số : idHook: Xác