1. Bước 1:
Trước hết, tạo một Project VC++ Win32 DLL (xin đừng nhầm với dạng DLL Class Library) với 1 file duy nhất có nội dung như sau:
File “TestDLL.cpp”
Code:
Mã:
#include <windows.h> //vùng nhớ dùng chung, chứa biến handle của Hook#pragma data_seg("SHARED_DATA")HHOOK hGlobalHook = NULL;#pragma data_seg() //hàm lọc sự kiện nhấn phím__declspec(dllexport) LRESULT CALLBACK FillKeyboard(int nCode, WPARAM wParam, LPARAM lParam) { /ếu sự kiện là nhấn phím và mã phím là Enter if ((nCode == HC_ACTION) && (wParam == 13)) { MessageBox(0, "sonhn say hello :)", "Hello", 0); return 1; } //gọi Filter Function kế tiếp trong chuỗi các Filter Function return CallNextHookEx(hGlobalHook, nCode, wParam, lParam);} //hàm ấn định biến hGlobalHook tại vùng nhớ dùng chung__declspec(dllexport) void SetGlobalHookHandle(HHOOK hHook){ hGlobalHook = hHook;}
Đoạn code trên có 3 điểm cần chú ý:
- Đoạn khai báo vùng nhớ dùng chung “SHARED_DATA”: vùng nhớ này chứa handle của Hook được cài. Sở dĩ nó phải được đặt trong vùng nhớ dùng chung vì cả 2 chương trình (DLL và EXE) đều cần truy phải truy xuất vào.
- Hàm lọc sự kiện nhấn phím: hàm này thực hiện nhiệm vụ: khi sự kiện là nhấn phím (nCode == HC_ACTION) và phím được nhấn là Enter (wParam == 13) thì “bắn” cái message box ra.
- Hàm ấn định biến hGlobalHook: hàm này sẽ được gọi bởi chương trình EXE sau đây để ấn định handle cho Hook mà nó sẽ cài.
Tạo file Module-Definition (.def) có nội dung như bên dưới để export các hàm bên trong file DLL và khai báo vùng nhớ dùng chung.
File “TestDLL.def”
Mã:
LIBRARY "TestDLL"EXPORTS FillKeyboard SetGlobalHookHandle SECTIONS
SHARED_DATA Read Write SharedBiên project trên để thu được file “TestDLL.dll”
2. Bước 2:
Tạo project VC++ dạng Win32 Application để thực hiện cài hàm lọc (trong file TestDLL.dll) vào sự kiện nhấn phím.
File “TestHook.cpp”
Mã:
#include <windows.h> //các biến toàn cụcHHOOK hHook = NULL; //handle của hookHMODULE hDll; //handle của DLL //định nghĩa con trỏ hàm SetGlobalHookHandle() trong file DLLtypedef VOID (*LOADPROC)(HHOOK hHook); BOOL InstallHook(); int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { //cài đặt hook, exit nếu thất bại if (InstallHook() == FALSE) { MessageBox(0, "Can not install hook!", "Error", 0); return -1; } MSG msg; BOOL bRet; //vòng lặp đón và xử lý các message while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0;} //Hàm cài đặt hookBOOL InstallHook() { //load file DLL if (LoadLibrary("TestDLL.dll") == NULL) { MessageBox(0, "Can not load DLL file.", "Error", 0); return FALSE; } //lấy handle của file DLL HMODULE hDLL = GetModuleHandle("TestDLL"); //exit nếu load DLL không thành công if (hDLL == NULL) { return FALSE; } //cài đặt hook, phạm vi toàn cục hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetProcAddress(hDLL,"FillKeyboard"), hDLL, 0); //exit nếu cài đặt Hook không thành công if (hHook == NULL) { return FALSE; } //lấy địa chỉ hàm SetGlobalHookHandle() trong file DLL LOADPROC fPtrFcnt; fPtrFcnt = (LOADPROC)GetProcAddress(hDLL, "SetGlobalHookHandle"); if (fPtrFcnt == NULL) { return FALSE; } //ấn định handle của hook vào vùng nhớ dùng chung (giữa DLL và ứng dụng này) fPtrFcnt(hHook); return TRUE;}
View more random threads:
Ngọc Bích xanh bản chất thuộc dòng đá đá hoa (jade). Và cẩm thạch là tên gọi chung của ngọc bích. Vì thực chất chúng thuộc dòng đá đa khoáng được hình thành từ chất Silicat dưới dạng dioxy. Ngọc bích...
Chia sẻ Vòng tay ngọc bích xanh là...