1
首先介绍一下鼠标键盘钩子
通过
HHOOK SetWindowsHookEx(WH_MOUSE ..WH_KEYBOARD ....,lpfn,NULL,getcurrenthreadid );
可以安装鼠标或者键盘钩子
在钩子的响应函数中lpfn中
return 1; 返回一个非0值即可屏蔽鼠标或者键盘消息 或者处理消息然后return callnexthookex传给下一个钩子
2
通过安装callwndproc钩子SetWindowsHookEx(WH_CALLWNDPROC, HookProc, NULL, GetCurrentThreadId());
可以截获messagebox的时候 发送的wm_initdlg 消息 从而子类化消息框 从而改变外观
大体步骤如下
HHOOK hHook = NULL;
WNDPROC oldProc = NULL;
1 在适当位置安装callwndproc钩子
hHook = SetWindowsHookEx(WH_CALLWNDPROC, HookProc, NULL, GetCurrentThreadId());
2 定义钩子响应函数 hookproc
LRESULT CALLBACK HookProc(int code, WPARAM wparam, LPARAM lparam)
{
if (code == HC_ACTION)
{
CWPSTRUCT * pwp = (CWPSTRUCT*)lparam;
if (pwp->message ==/*WM_LBUTTONDOWN */WM_INITDIALOG)
{
//return 1;
//MessageBox(NULL, L"拦截成功", L"拦截成功", MB_OK);
oldProc = (WNDPROC)SetWindowLong(pwp->hwnd, GWL_WNDPROC, (LONG)HookWndProc);
}
}
return CallNextHookEx(hKeyHook, code, wparam, lparam);
}
3 定义子类化窗口消息处理函数 HookWndProc
LRESULT CALLBACK HookWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_PAINT)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 88));
HBRUSH hBrushOld = (HBRUSH)SelectObject(hdc, hBrush);
RECT rect;
GetClientRect(hWnd, &rect);
Rectangle(hdc, 0, 0, rect.right, rect.bottom);
SelectObject(hdc, hBrushOld);
DeleteObject(hBrush);
EndPaint(hWnd, &ps);
}
return oldProc(hWnd, message, wParam, lParam);
}
4 完成