Windows Forms: Снимок экрана при неграфическом запуске (то есть заставка активна)

StackOverflow https://stackoverflow.com/questions/183118

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня есть приложение, которое очень интенсивно использует графику и построено на DirectX и Windows Forms. Он имеет систему автоматизации и воспроизведения, вокруг которой построена автоматизированная система тестирования. К сожалению, когда тесты запускаются без присмотра во время ночной сборки, дисплей неактивен или связан с заставкой, и наши политики безопасности ИТ не позволяют нам отключить это.

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

Любая помощь очень ценится!

Это было полезно?

Решение

Поскольку вы упомянули конвейер рендеринга, то я предполагаю, что вы используете Direct3d, если это так, вы можете сохранить буфер буфера кадра. Я сделал это, когда все еще использовал VB.Net + MDX

Dim tempSurface As Direct3D.Surface
tempSurface = device.GetBackBuffer(0, 0, Direct3D.BackBufferType.Mono)
Direct3D.SurfaceLoader.Save(tempFilename, Direct3D.ImageFileFormat.Png, tempSurface)

Вы можете легко конвертировать любой язык программирования по вашему выбору, в основном это вызов API Direct3d. Однако вам необходимо настроить параметры backbuffer и Present как

' Need to use flip to enable screen capture
presentParams.SwapEffect = Direct3D.SwapEffect.Flip 
presentParams.PresentationInterval = Direct3D.PresentInterval.One

Другие советы

Установите виртуальную машину и запустите приложение в ней. Если вы используете заставку, я сомневаюсь, что ваша видеокарта даже генерирует графический интерфейс для приложения.

Если я правильно понимаю, все, что вам нужно, - это сделать снимок экрана с определенным приложением и не повлиять на результат из-за возможной работающей заставки? Насколько я знаю, простое выполнение GetDIBits на HDC правильного окна должно помочь, а не заботиться о заставке.

Этот код может показаться очень медленным, однако вы можете значительно ускорить его, установив PresentParams.PresentFlag = PresentFlag.LockableBackBuffer

Кроме того, вам не нужно устанавливать PresentInterval.One или SwapEffect.Flip , их можно оставить в .Default и .Discard соответственно.

(Обратите внимание, что это ускорение не работает, если вы используете мультисэмплинг, убедитесь, что PresentParams.Multisample = Multisample.None . Если у вас есть карта Nvidia, вы все равно можете получить сглаживание, установив параметр в панели управления Nvidia, чтобы изменить настройки приложения на то, что вы хотите!)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top