2015-07-07 5 views
7

Я использую bitblt для захвата окна. Если тема aero включена, фон захваченного изображения черный. Если я отключу DWM и закрою окно, то захваченное изображение будет очень хорошим.Получить скриншот startmenu

Это часть моего кода.

HDC hdcMemDC = GDI32.INSTANCE.CreateCompatibleDC(desktopDC); 
HDC windowDC = User32.INSTANCE.GetDC(window); 

HWND window= User32Extra.INSTANCE.FindWindow(null, "Start menu"); 

GDI32Extra.INSTANCE.BitBlt(hdcMemDC, 0, 0, width, height, desktopDC, 0, 0, WinGDIExtra.SRCCOPY); 
GDI32Extra.INSTANCE.BitBlt(hdcMemDC,windowBounds.left, windowBounds.top, windowWidth, windowHeight, windowDC, windowBounds.left+windowBounds1.right-windowBounds.right+(windowExtraGap/2), windowBounds.top+windowBounds1.bottom-windowBounds.bottom+(windowExtraGap/2), WinGDIExtra.SRCCOPY); 

enter image description here

Как захватить начальное меню с собственным фоном?

Существуют ли какие-либо другие методы для получения правильного изображения окна аэро?

+1

[Диспетчер рабочего стола всегда включен] (https://msdn.microsoft.com/en-us/library/windows/desktop/hh848042.aspx): * «В Windows 8 диспетчер окон рабочего стола (DWM) всегда включен и не может быть отключен конечными пользователями и приложениями. "* – IInspectable

+1

Вы хотите отключить композицию DWM или хотите получить скриншот? –

+0

Я хочу правильный снимок экрана HWND. – Vishnu

ответ

4

использование рабочего стола DC и разрезают окна

RECT rc, rc2; 
GetClientRect(hWnd, &rc); 
GetWindowRect(hWnd, &rc2); 
int width = rc2.right - rc2.left; 
int height = rc2.bottom - rc2.top; 
HDC hdcScreen = GetDC(NULL); //!!!! Get desktop DC 

HDC  hBmpFileDC = CreateCompatibleDC(hdcScreen); 
HBITMAP hBmpFileBitmap = CreateCompatibleBitmap(hdcScreen, width, height); 
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hBmpFileDC, hBmpFileBitmap); 
BitBlt(hBmpFileDC, 0, 0, width, height, hdcScreen, rc2.left, rc2.top, SRCCOPY | CAPTUREBLT); 
HGDIOBJ prev = SelectObject(hBmpFileDC, hOldBitmap); 

SaveBitmap(szLogFilename, hBmpFileBitmap); 

DeleteDC(hBmpFileDC); 
DeleteObject(hBmpFileBitmap); 

другой вариант

RECT rc; 
GetClientRect(hWnd, &rc); 

int width = rc.right - rc.left; 
int height = rc.bottom - rc.top; 

HDC hdcScreen = GetDC(hWnd); 
//////////////////////////// 
PrintWindow(hWnd, hdcScreen, 0); 
PrintWindow(hWnd, hdcScreen, PW_CLIENTONLY); 
////////////////////////////  
HDC  hBmpFileDC = CreateCompatibleDC(hdcScreen); 
HBITMAP hBmpFileBitmap = CreateCompatibleBitmap(hdcScreen, width, height); 
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hBmpFileDC, hBmpFileBitmap); 
BitBlt(hBmpFileDC, 0, 0, width, height, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT); 
HGDIOBJ prev = SelectObject(hBmpFileDC, hOldBitmap); 

SaveBitmap(szLogFilename, hBmpFileBitmap); 

DeleteDC(hBmpFileDC); 
DeleteObject(hBmpFileBitmap); 

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

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

  • Нет связанных вопросов^_^