Насколько я знаю, лучший способ - подключиться к циклу сообщений Windows. В вашем случае вы должны передать HWND 0 (если я правильно помню это HWND рабочего стола), чтобы все сообщения сначала проходили через вашу функцию.
http://msdn.microsoft.com/en-us/library/ms633591%28VS.85%29.aspx
Больше на крючках: http://msdn.microsoft.com/en-us/library/ms644959%28VS.85%29.aspx
Используйте его следующим образом:
m_nOldWindowProc = ::SetWindowLong(0 /<em>I think...</em>/, GWL_WNDPROC, (LPARAM)(WNDPROC)WindowProcCallback);
и обратный вызов:
LRESULT CALLBACK CStubWindow::WindowProcCallback(HWND hwnd,
UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_WINDOWPOSCHANGING:
((WINDOWPOS*)lParam)->cx = STATUS_BAR_WIDTH;</p>
<pre><code> ((WINDOWPOS*)lParam)->flags = SWP_NOOWNERZORDER | SWP_NOMOVE;
break;
default:
break;
}
return ::CallWindowProc(m_nOldWindowProc, hwnd, message, wParam, lParam);
}