通过安装钩子改变MessageBox外观,

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 完成

你可能感兴趣的:(windows程序设计)