скриншоты закрытых / свернутых окон - PullRequest
3 голосов
/ 17 марта 2010

У меня есть следующий код, чтобы сделать скриншоты окна:

HDC WinDC;
HDC CopyDC;
HBITMAP hBitmap;
RECT rt;

GetClientRect (hwnd, &rt);
WinDC = GetDC (hwnd);
CopyDC = CreateCompatibleDC (WinDC);

hBitmap = CreateCompatibleBitmap (WinDC,
 rt.right - rt.left, //width
 rt.bottom - rt.top);//height

SelectObject (CopyDC, hBitmap);

//Copy the window DC to the compatible DC
BitBlt (CopyDC,   //destination
 0,0,
 rt.right - rt.left, //width
 rt.bottom - rt.top, //height
 WinDC,    //source
 0, 0,
 SRCCOPY);

ReleaseDC(hwnd, WinDC);
ReleaseDC(hwnd, CopyDC);

Это кто-то другой, немного измененный код, так как я не очень знаком с DC и с тем, как окна рисуют вещи на экране.

Когда у меня есть одно окно, слегка закрывающее другое, на скриншотах покрытого окна появляется закрывающее окно, что довольно неудобно. Кроме того, когда окно свернуто, этот код не производит ничего особенного.

Есть ли способ обойти это? Я полагаю, что сделать скриншоты свернутого приложения было бы довольно сложно, но я надеюсь, что получение скриншотов покрытых окон возможно. Возможно, существует другой способ реализации этого, чтобы обойти эти проблемы?

1 Ответ

4 голосов
/ 17 марта 2010

Нет, скриншот именно так и звучит. Вы прочтете пиксели видеоадаптера, и вы получите то, что видите. Вам придется восстановить окно и вывести его на передний план, чтобы получить полный обзор. WM_SYSCOMMAND + SC_RESTORE и SetForegroundWindow () соответственно. Плюс некоторое время, чтобы приложение могло перекрасить свое окно, если это необходимо.

Доступно сообщение WM_PRINT, чтобы попросить окно нарисовать себя в контексте памяти. Это может решить проблему перекрывающихся окон. Но это может работать, только если у вас есть окно. И редко дает ожидаемый результат, программисты не всегда правильно реализуют WM_PRINT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...