Помогите... Необходимо получить "снимки" всех видимых окон в системе. Технология не особо важна (WinAPI, .Net инструменты, DirectX, если поможет). Язык — С++ или C#
На данный момент легко получаю HWND'ы необходимых окон. Дальше пользуюсь тем, что нашел на бескрайних просторах
Krugle:
void GrabWindow(HWND winId)
{
RECT r;
GetWindowRect(winId, &r);
int w = r.right - r.left;
int h = r.bottom - r.top;
// Create and setup bitmap
HDC window_dc = GetWindowDC(winId);
HDC bitmap_dc = CreateCompatibleDC(window_dc);
HBITMAP bitmap = CreateCompatibleBitmap(window_dc, w, h);
HGDIOBJ null_bitmap = SelectObject(bitmap_dc, bitmap);
// copy data
BitBlt(bitmap_dc, 0, 0, w, h, window_dc, 0, 0, SRCCOPY);
// LOGIC HERE
// ------------------------------------
// LOGIC HERE
// clean up all but bitmap
ReleaseDC(winId, window_dc);
SelectObject(bitmap_dc, null_bitmap);
DeleteDC(bitmap_dc);
DeleteObject(bitmap);
}
Проблема в том, что он получает не снимок окна, а снимок экрана в нужной области. Если окно активно — то все правильно. А если поверх нужного окна расположено другое, то получаем фрагмент верхнего окна. Как дополнение — всяки всплывающие подсказки и прочий мусор в bitmap'е.
Временное решение — скрыть все окна, при переборе показывать необходимое, снимать, скрывать; по окончании перебора показать все окна, которые были видны. Ужасно работает, но работает.
Может, кто-нибудь знает нормальны путь получения снимка с произвольного окна?