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'е. Временное решение — скрыть все окна, при переборе показывать необходимое, снимать, скрывать; по окончании перебора показать все окна, которые были видны. Ужасно работает, но работает.

Может, кто-нибудь знает нормальны путь получения снимка с произвольного окна?
Re: Window grabing - снимок произвольного окна
От: Andrew S Россия http://alchemy-lab.com
Дата: 30.08.06 08:23
Оценка: 2 (1)
A>Помогите... Необходимо получить "снимки" всех видимых окон в системе. Технология не особо важна (WinAPI, .Net инструменты, DirectX, если поможет). Язык — С++ или C#

[]

A>Проблема в том, что он получает не снимок окна, а снимок экрана в нужной области. Если окно активно — то все правильно. А если поверх нужного окна расположено другое, то получаем фрагмент верхнего окна. Как дополнение — всяки всплывающие подсказки и прочий мусор в bitmap'е. Временное решение — скрыть все окна, при переборе показывать необходимое, снимать, скрывать; по окончании перебора показать все окна, которые были видны. Ужасно работает, но работает.


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


http://gzip.rsdn.ru/Forum/Message.aspx?mid=172747&only=1
Автор: Andrew S
Дата: 14.01.03
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: Window grabing - снимок произвольного окна
От: spbAngel  
Дата: 31.08.06 08:42
Оценка:
Спасибо огромное.

Пока не проверял, но думаю, поможет. В другом форуме
Автор: apple-antonovka
Дата: 29.08.06
мне посоветовали PrintWindow, но он работает только под XP и 2003. А не охота так ограничиваться. Вот только прорисуются ли оверлеи при помощи WM_PRINT? (PrintWindow не прорисовывает) Или PrintWindow как раз и посылает WM_PRINT? По названию похоже...
Re[3]: Window grabing - снимок произвольного окна
От: Andrew S Россия http://alchemy-lab.com
Дата: 31.08.06 13:41
Оценка:
A>Спасибо огромное.

A>Пока не проверял, но думаю, поможет. В другом форуме
Автор: apple-antonovka
Дата: 29.08.06
мне посоветовали PrintWindow, но он работает только под XP и 2003. А не охота так ограничиваться. Вот только прорисуются ли оверлеи при помощи WM_PRINT? (PrintWindow не прорисовывает) Или PrintWindow как раз и посылает WM_PRINT? По названию похоже...


Оверлеи скорее всего не будут прорисовываться. Хотя... Тут я не пробовал, возможно, и с этим можно побороться. А так — да, PrintWindow делает примерно то же, что и код в указанной статье. Ну, конечно, без ненужных в этом случае хаков Begin\EndPaint.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.