2008-10-08 2 views
1

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

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

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

ответ

2

Поскольку вы упомянули конвейер рендеринга, так что я предполагаю, что вы используете Direct3d, если это так, вы можете сохранить backbuffer кадра. Я сделал это, когда я был еще с помощью 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 и текущих параметров, как

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

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

0

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

+0

Это сделает захват того, что когда-либо будет на экране, которое должно включать заставку. Я не тестировал это, но я использовал этот метод, чтобы зафиксировать, что когда-либо это наше приложение, как составной захват, более похожий на «экран печати» – faulty 2008-10-09 07:31:25

+0

Я уверен, что вы ошибаетесь, но мне пришлось бы купите некоторый тестовый код, чтобы доказать это;) – korona 2008-10-09 08:30:56

0

Вы можете найти этот код, чтобы быть очень медленным, но вы можете получить массовый прирост скорости, установив PresentParams.PresentFlag = PresentFlag.LockableBackBuffer

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

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

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

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