#include <windows.h> #include "hook.h"
typedef LRESULT (CALLBACK * HOOKPROC)(int code, WPARAM wParam, LPARAM lParam); typedef HHOOK (WINAPI * SetWindowsHookFunc)(int, HOOKPROC, HINSTANCE, DWORD); typedef LRESULT (WINAPI * UnhookWindowsHookFunc)(HHOOK);
typedef struct { DWORD vkCode; DWORD scanCode; DWORD flags; DWORD time; ULONG_PTR dwExtraInfo; } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
#define WH_KEYBOARD_LL 20 #define HC_ACTION 0
extern HINSTANCE g_hInstance;
HHOOK m_hHook;
LRESULT CALLBACK LLKeyboardHookCallbackFunction(int nCode, WPARAM wParam, LPARAM lParam) { printf("HOOK/n");
if(nCode >= HC_ACTION) { if((wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN)) { if(((KBDLLHOOKSTRUCT*)lParam)->vkCode == VK_TVOLUMEUP) { printf("Hook VK_TVOLUMEUP/n"); return TRUE; } } }
return FALSE; }
int DeactivateKBHook(void) { BOOL ret = FALSE;
//从coredll.dll获取UnhookWindowsHookEx函数 HMODULE hLibrary = LoadLibrary(_T("coredll.dll")); if(hLibrary == NULL) { goto Exit; }
UnhookWindowsHookFunc pfnUnhookWindowsHook = (UnhookWindowsHookFunc)GetProcAddress(hLibrary, _T("UnhookWindowsHookEx")); if(pfnUnhookWindowsHook == NULL) { goto Exit; }
//调用UnhookWindowsHookEx解除按键钩子 pfnUnhookWindowsHook(m_hHook);
ret = TRUE;
Exit: if (hLibrary != NULL) { FreeLibrary(hLibrary); }
return ret;
}
int ActivateKBHook(void) { BOOL ret = FALSE;
//从coredll.dll获取SetWindowsHookExW函数 HMODULE hLibrary = LoadLibrary(_T("coredll.dll")); if(hLibrary == NULL) { goto Exit; }
SetWindowsHookFunc pfnSetWindowHook = (SetWindowsHookFunc)GetProcAddress(hLibrary, _T("SetWindowsHookExW")); if(pfnSetWindowHook == NULL) { goto Exit; }
//调用SetWindowsHookExW注册按键钩子 m_hHook = pfnSetWindowHook(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, g_hInst, 0); if(m_hHook == NULL) { goto Exit; }
ret = TRUE;
Exit: if (hLibrary != NULL) { FreeLibrary(hLibrary); }
return ret;
} |