2010-03-17 2 views
3

Я следующий код, чтобы делать скриншоты окна:скриншоты крытых/свернутых окон

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 и как окна черпает материал для экрана.

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

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

ответ

4

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

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

+0

WM_PRINT вещь может быть удобной и не должна быть слишком сложной. Благодарю. – Oliver

+0

Справедливости ради, вы вряд ли читаете пиксели непосредственно с видеоадаптера - возможно, из внутреннего буфера, хранящегося в Windows. Я мог ошибаться, но я был бы удивлен, если бы это было сделано не так. –

Смежные вопросы