Специальное окно захвата экрана

Можно ли отображать конкретное окно (возможно, другого процесса)?

В настоящее время я захватываю весь рабочий стол определенного монитора, однако я действительно хочу, чтобы захватить содержимое определенного окна (независимо от его положения).

Ответ 1

Да, это так. Все, что вам нужно, это обработать окно, которое вы хотите захватить, и использовать функцию WinAPI PrintWindow, например:

// Get the window handle of calculator application.
HWND hWnd = ::FindWindow( 0, _T( "Calculator" ));

// Take screenshot.
PrintWindow( hWnd, getDC(hWnd), 0 );

Здесь у вас есть документация PrintWindow.

Ответ 2

Да, так же просто, как захват всего экрана. Вы просто используете GetWindowDC() в нужном окне, а не GetDesktopWindow(), а затем BitBlt() от этого к целевому DC. Вы также можете получить правильный размер, используя GetWindowRect().

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

Подробнее см. этот вопрос.