一、进程内HOOK
HHOOK g_hKeyboard=NULL;
BOOL CInnerHookDlg::OnInitDialog()
{
...
// 安装HOOK
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
...
}
void CInnerHookDlg::OnClose()
{
// 卸载HOOK
UnhookWindowsHookEx(g_hKeyboard);
}
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(VK_F4==wParam && (1==(lParam>>29 & 1)))
return 1;
else
return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
if(VK_F2==wParam)
{
::SendMessage(g_hWnd,WM_CLOSE,0,0);
}
return 1;
}
二、全局HOOK
全局HOOK需要提供在DLL中
1. Hook.dll的编写
"Hook.cpp"
#include <windows.h>
HHOOK g_hKeyboard=NULL;
#pragma data_seg("MySec") // 在DLL中添加自定义节点
HWND g_hWnd=NULL;
#pragma data_seg()
#pragma comment(linker,"/section:MySec,RWS") // 指定节点是可读、可写、共享的类型节点
HINSTANCE g_hInst;
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved ) {
g_hInst=hinstDLL;
}
// HOOK过程函数
LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam){
if(VK_F2==wParam){
SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hKeyboard);
}
return 1;
}
// HOOK安装函数(导出,外部程序要使用该函数安装HOOK)
void SetHook(HWND hwnd)
{
g_hWnd=hwnd;
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hInst/*GetModuleHandle("Hook")*/,0);
}
"Hook.def"
LIBRARY Hook
EXPORTS
SetHook @2
SEGMENTS
MySec READ WRITE SHARED
2. Hook.dll的使用
_declspec(dllimport) void SetHook(HWND hwnd); // 导入函数
BOOL CHookTestDlg::OnInitDialog()
{
...
SetHook(m_hWnd); // 调用(该HOOK对桌面上所有运行的进程都有效)
...
}