Лучше так:
1. создаешь compatible dc, инициализируешь — смотри код, как писали выше.
2. А теперь внимание:
SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)hCompatibleDC, 0);
SendMessage(hwnd, WM_PAINT, (WPARAM)hCompatibleDC, 0);
и содержимое окна рисуется в наш DC (без наложения других окон).
3. забираешь bitmap у нашего DC.
P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.