Window grabing - снимок произвольного окна
От: spbAngel  
Дата: 29.08.06 11:22
Оценка:
Помогите... Необходимо получить "снимки" всех видимых окон в системе. Технология не особо важна (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'е. Временное решение — скрыть все окна, при переборе показывать необходимое, снимать, скрывать; по окончании перебора показать все окна, которые были видны. Ужасно работает, но работает.

Может, кто-нибудь знает нормальны путь получения снимка с произвольного окна?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.