Помогите... Необходимо получить "снимки" всех видимых окон в системе. Технология не особо важна (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'е.
Временное решение — скрыть все окна, при переборе показывать необходимое, снимать, скрывать; по окончании перебора показать все окна, которые были видны. Ужасно работает, но работает.
Может, кто-нибудь знает нормальны путь получения снимка с произвольного окна?
A>Помогите... Необходимо получить "снимки" всех видимых окон в системе. Технология не особо важна (WinAPI, .Net инструменты, DirectX, если поможет). Язык — С++ или C#
[]
A>Проблема в том, что он получает не снимок окна, а снимок экрана в нужной области. Если окно активно — то все правильно. А если поверх нужного окна расположено другое, то получаем фрагмент верхнего окна. Как дополнение — всяки всплывающие подсказки и прочий мусор в bitmap'е. Временное решение — скрыть все окна, при переборе показывать необходимое, снимать, скрывать; по окончании перебора показать все окна, которые были видны. Ужасно работает, но работает.
A>Может, кто-нибудь знает нормальны путь получения снимка с произвольного окна?
http://gzip.rsdn.ru/Forum/Message.aspx?mid=172747&only=1Автор: Andrew S
Дата: 14.01.03
Спасибо огромное.
Пока не проверял, но думаю, поможет. В
другом форумеАвтор: apple-antonovka
Дата: 29.08.06
мне посоветовали PrintWindow, но он работает только под XP и 2003. А не охота так ограничиваться. Вот только прорисуются ли оверлеи при помощи WM_PRINT? (PrintWindow не прорисовывает) Или PrintWindow как раз и посылает WM_PRINT? По названию похоже...
A>Спасибо огромное.
A>Пока не проверял, но думаю, поможет. В другом форумеАвтор: apple-antonovka
Дата: 29.08.06
мне посоветовали PrintWindow, но он работает только под XP и 2003. А не охота так ограничиваться. Вот только прорисуются ли оверлеи при помощи WM_PRINT? (PrintWindow не прорисовывает) Или PrintWindow как раз и посылает WM_PRINT? По названию похоже...
Оверлеи скорее всего не будут прорисовываться. Хотя... Тут я не пробовал, возможно, и с этим можно побороться. А так — да, PrintWindow делает примерно то же, что и код в указанной статье. Ну, конечно, без ненужных в этом случае хаков Begin\EndPaint.