Windows Forms: captura de pantalla cuando se ejecuta de forma no gráfica (es decir, el protector de pantalla está activo)

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo una aplicación que requiere muchos gráficos y se basa en DirectX y Windows Forms. Tiene un marco de automatización y reproducción en torno al cual se construye un sistema de prueba automatizado. Desafortunadamente, cuando las pruebas se ejecutan sin supervisión durante una compilación nocturna, la pantalla está inactiva o vinculada con el protector de pantalla, y nuestras políticas de seguridad de TI no nos permiten desactivar eso.

Entonces mi pregunta: ¿hay alguna manera de hacer una " pantalla " captura de una aplicación que se ejecuta sin la pantalla? Me gustaría asegurarme de que la tarjeta gráfica esté activada para que mi canal de renderizado sea el mismo, pero el marco de prueba no debería preocuparse por el estado de la pantalla.

¡Cualquier ayuda enormemente apreciada!

¿Fue útil?

Solución

Dado que se menciona la canalización de representación, así que supongo que está utilizando Direct3d, si es así, puede guardar el backbuffer del marco. Lo hice cuando todavía estaba usando VB.Net + MDX

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

Puede convertir fácilmente que haga cualquier lenguaje de programación de su elección, básicamente está llamando a la API de Direct3d. Sin embargo, debe configurar su backbuffer y los parámetros actuales como

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

Otros consejos

Instale una VM y ejecute la aplicación en eso. Si está ejecutando un protector de pantalla, dudo que su tarjeta de video incluso esté generando la GUI para la aplicación.

Si entiendo correctamente, ¿todo lo que desea hacer es tomar una captura de pantalla de una aplicación específica y no hacer que el resultado se vea afectado por un protector de pantalla posiblemente en ejecución? Hasta donde sé, simplemente hacer GetDIBits en el HDC de la ventana correcta debería ser el truco y no preocuparse por el protector de pantalla.

Puede encontrar que este código es muy lento, sin embargo, puede obtener una aceleración masiva configurando PresentParams.PresentFlag = PresentFlag.LockableBackBuffer

Además, no es necesario establecer PresentInterval.One o SwapEffect.Flip , se pueden dejar en .Default y .Discard de forma repetitiva.

(Tenga en cuenta que esta aceleración no funciona si está utilizando muestreo múltiple, asegúrese de que PresentParams.Multisample = Multisample.None . Si tiene una tarjeta Nvidia, aún puede obtener antialiasing configurando la opción en el panel de control de Nvidia para anular la configuración de la aplicación a lo que quieras)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top