Windows Forms: Снимок экрана при неграфическом запуске (то есть заставка активна) - PullRequest
1 голос
/ 08 октября 2008

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

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

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

Ответы [ 4 ]

2 голосов
/ 09 октября 2008

Поскольку вы упомянули конвейер рендеринга, поэтому я предполагаю, что вы используете 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
0 голосов
/ 15 апреля 2011

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

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

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

0 голосов
/ 08 октября 2008

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

0 голосов
/ 08 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...