2013-11-13 4 views
5

Я пытаюсь сделать снимок экрана из окна Chrome. Это выглядит следующим образом:PrintWindow вызывает мерцание, странные артефакты в заголовке

Chrome window

Когда я использую PrintWindow, чтобы получить снимок экрана, я могу видеть мерцание в заголовке окна/Chrome вкладки области. Захваченный кадр содержит странный рендеринг заголовка в Windows, Basic стиле (хотя моя машина работает тема Aero):

Captured image

Я заметил, что некоторые другие приложения также демонстрируют подобное поведение, когда они мерцать на экране, но артефакт заголовка не отображается на захваченном снимке экрана. Приложения, которые это делают, включают Office 2010, IE 10 и окно чата с вкладками Trillian —, другими словами, окна, которые расширяют область без клиентов, похоже, имеют эту проблему.

код, который воспроизводит это просто:

void Screenshot(HWND hWnd) { 

    RECT rc; 
    GetClientRect(hWnd, &rc); 

    HDC hdcScreen = GetDC(NULL); 
    HDC hdc = CreateCompatibleDC(hdcScreen); 
    HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, 
     rc.right - rc.left, rc.bottom - rc.top); 
    SelectObject(hdc, hbmp); 

    //Print to memory hdc 
    PrintWindow(hWnd, hdc, PW_CLIENTONLY); 

} 

Почему я вижу мерцающий и странные визуальные артефакты? Что я могу сделать, чтобы остановить его?

+0

Используя свой код, я не могу воспроизвести. Windows Seven 64. Сборка 32b или 64b. Использование PW_CLIENTONLY или 0. Цель: основное окно Chrome или главное окно Excel 2010. No Flicker, «почти» хороший PNG (с использованием GDIPLUS) – manuell

+0

@manuell: Интересно, что из моего фактического приложения мерцание происходит каждый раз, когда я вызываю «PrintWindow» (который вскоре после того, как окно получает фокус). В тестовом приложении barebones, где я делаю 'while (1) {Screenshot (hWnd); Сон (100); } ', мерцание прерывисто. – josh3736

+0

Службы процессов «фокус» и «активность» окна сообщения длинный/до/фактическая краска происходит, imho. Держу пари, что ваш запрос приходит слишком рано. Постарайтесь отложить больше. Трудно помочь без контекста. Скриншоты, сделанные с хорошим старым BitBblt, не мерцают, а потребляют меньше ресурсов, но дают иногда забавные результаты, когда окна просто «сводят к минимуму» или «восстанавливают» – manuell

ответ

1

Если Aero включен, вместо этого используйте BitBlt.

Этот комментарий в chromium desktop capture source code было особенно полезно:

// When desktop composition (Aero) is enabled each window is rendered to a 
// private buffer allowing BitBlt() to get the window content even if the 
// window is occluded. PrintWindow() is slower but lets rendering the window 
// contents to an off-screen device context when Aero is not available. 
Смежные вопросы