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:
Hiện nay, có khá nhiều sản phẩm dương vật giả giá rẻ xuất hiện trên thị trường. Chúng đến từ các nhà sinh sản ở khắp nơi trên thế giới như Mỹ, Nhật, Hồng Kông…Hơn nữa, các đồ chơi này cũng khá đa...
Top một số dương vật giả rẻ và...