我用了 WH_CALLWNDPROC ,钩子函数中
CWPSTRUCT* cwps = (CWPSTRUCT*)lParam;
if( cwps->message == WM_PAINT )
TRACE(_T("PM_REMOVE----------------WM_PAINT .\r\n"));但是对话框调用 OnPaint 了,在钩子函数中始终未 cwps->message == WM_PAINT 为真。
CWPSTRUCT* cwps = (CWPSTRUCT*)lParam;
if( cwps->message == WM_PAINT )
TRACE(_T("PM_REMOVE----------------WM_PAINT .\r\n"));但是对话框调用 OnPaint 了,在钩子函数中始终未 cwps->message == WM_PAINT 为真。
在TRACE处设置了断点根本不过去,第一次显示对话框会捕获到,以后再刷新窗口时 OnPaint调用了,但是钩子函数中没有捕获 WM_PAINT ,钩子设置是成功的 可以正确捕获 WM_ERASEBKGND .
在YourWindowProc中处理就行
typedef LONG LPARAM;
随你,一般在lParam指向一个指针参数,强制转换一下就行了。
刚用这个试过,绝对可以捕到wm_paint
不过子类化指定窗口
应该可以获得的!
WNDPROC wpOrigProc; wpOrigProc = (WNDPROC)::SetWindowLong(hWnd,
GWL_WNDPROC, (LONG)SubclassProc); 子类化的窗体处理函数
LRESULT APIENTRY SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_PAINT)
{
}
return CallWindowProc(wpOrigProc, hwnd, uMsg,
wParam, lParam);
} 至于你说的那个为什么不好使,我也不怎么清楚!
CSDN上有这样一句话!但是我没怎么看明白!如果有高手路过的话,帮忙解释下!^_^
The system sends an internal WM_PAINT message only once. After an internal WM_PAINT message is returned from GetMessage or PeekMessage or is sent to a window by UpdateWindow, the system does not post or send further WM_PAINT messages until the window is invalidated or until RedrawWindow is called again with the RDW_INTERNALPAINT flag set.