生成DLL文件,模塊定義文件爲:
LIBRARY Hook
EXPORTS
SetHook @2
// Hook.cpp #include <windows.h> HHOOK g_hMouse = NULL; HHOOK g_hKeyboard = NULL; // 爲Hook.DLL創建一個新的節,將全局變量g_hWnd放入其中 #pragma data_seg("MySec") HWND g_hWnd = NULL; #pragma data_seg() // 設置剛創建的節爲共享的節 #pragma comment(linker, "/section:MySec,RWS") // 鼠標鉤子過程 LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { return 1; // 屏蔽所有鼠標消息 } // 鍵盤鉤子過程 LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { // 後門按鍵用於結束該進程 if (VK_F2 == wParam) { ::SendMessage(g_hWnd, WM_CLOSE, 0, 0); UnhookWindowsHookEx(g_hKeyboard); UnhookWindowsHookEx(g_hMouse); } else { return 1; // 屏蔽所有鍵盤消息 } } // 安裝鼠標鉤子過程的函數 void SetHook(HWND hwnd) // 參數是爲了讓dll獲得調用進程的主窗口的句柄 { g_hWnd = hwnd; // hook所有進程的鼠標、鍵盤消息 g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("Hook.dll"), 0); g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle("Hook.dll"), 0); }
調用DLL的進程的實現:
///////////////////////////////////////////////////////////////////////////// // CHookTestDlg message handlers // 導入函數 __declspec(dllimport) void SetHook(HWND hwnd); BOOL CHookTestDlg::OnInitDialog() { // TODO: Add extra initialization here // 頂層窗口及最大化窗口的實現 int cxScreen, cyScreen; cxScreen = GetSystemMetrics(SM_CXSCREEN); cyScreen = GetSystemMetrics(SM_CYSCREEN); SetWindowPos(&wndTopMost, 0, 0, cxScreen, cyScreen, SWP_SHOWWINDOW); // 調用DLL中的函數 SetHook(m_hWnd); return TRUE; // return TRUE unless you set the focus to a control }
///////////////////////////////////////////////////////////////////////////// // CInnerHookDlg message handlers HHOOK g