2013-08-23 13 views
1

Я хочу получить снимок экрана наиболее эффективным образом. Это будет использоваться в программе, которая работает в фоновом режиме, когда запущены другие интенсивные программы (игры), и я не хочу влиять на их производительность (слишком много). Снимок экрана будет иметь несколько (10+) раз в секунду, поэтому я хочу, чтобы он был как можно быстрее.Эффективный захват всего экрана

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

Кроме того, некоторые приложения захватывают весь экран (например, skyrim), и я думаю, что они обходят систему Window, используемую в приведенном выше. Вышеупомянутая ссылка не может получить эти изображения. Кто-нибудь есть идея, как их схватить?

+1

Попробуйте захватить экраны с помощью DIB http://msdn.microsoft.com/en-us/library/windows/desktop/dd183562%28v=vs.85%29.aspx. – Alexandr

+3

Взгляните на [Самый быстрый способ захвата экрана] (http://stackoverflow.com/q/5069104/859646). Также я предполагаю, что подходы GDI не будут захватывать наложения DirectX. – JRL

+1

Игры и видео DirectX появятся как черный прямоугольник. Сделайте проверку работоспособности, нажав клавишу PrintScr и вставив ее в редактор растровых изображений, при запуске различных целевых приложений (игр, видео и т. Д.). Если вы получите черные прямоугольники, на которых должен отображаться дисплей, это проблема DirectX. –

ответ

2

Я полагаю, вы имеете в виду только приложение Windows? Но даже для окон нет способа сделать это так эффективно, как вы просили. На многих компьютерах вы не сможете получить 10+ FPS, даже если ваше приложение является единственным запущенным приложением. Возможно, наиболее эффективным способом является использование драйвера зеркалирования, в этом случае у вас всегда будет копия экрана, но драйвер также повлияет на производительность, особенно в таких тяжелых приложениях, как 3D-игры. (я даже не спрашиваю, что вы будете делать с 10+ экранами на втором, потому что, что бы вы ни делали с ними, это займет время процессора или жесткого диска и замедлит работу 3D-приложений).

Yoo может захватывать не только весь экран, конечно, вы можете захватить любую часть. Вы можете использовать BitBlt, как показывает этот пример:

procedure CaptureFromScreen(Dest: TBitmap; x, y, w, h, screenx, screeny: integer); 
var 
    DC: hWnd; 
begin 
    DC := GetDC(0); 
    if DC = 0 then 
    exit; 
    bitblt(dest.canvas.handle, x, y, w, h, DC, screenx, screeny, SRCCOPY); 
    ReleaseDC(0, DC); 
end; 

Иногда полезно использовать (CAPTUREBLT или SRCCOPY) вместо SRCCOPY. Он помогает захватывать прозрачные элементы, но имеет некоторые побочные эффекты, например, курсор может мигать. И не уверен, как сделать снимок с наложения. Если вы смотрите фильм, скорее всего, игрок будет использовать оверлей и область возврата BITBLT, заполненную одним цветом вместо изображения.

+0

Да, это только Windows. Это первый шаг системы заднего освещения, который меняет цвет фонарей позади экрана (чтобы отразить стену или что-то еще) в зависимости от того, что отображается. – rspencer

+0

Зеркальные драйверы отключают эффекты Aero в Windows Vista и 7 и не поддерживаются в Windows 8: http://msdn.microsoft.com/en-us/library/windows/hardware/ff568315(v=vs.85).aspx – JRL

+0

@rspencer Для такой задачи я думаю, что было бы лучше захватить только фрейм (4 относительно небольших растровых изображения). Тогда вы сможете захватывать и обрабатывать его с гораздо более высоким FPS и разумной загрузкой процессора. И результат будет еще лучше, свет сзади должен «расширить» рабочий стол, поэтому стена, оставленная с экрана, должна иметь вид среднего цвета только с левой части экрана, ... –

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

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