Windows Forms: Capture d'écran lors d'une exécution non graphique (l'économiseur d'écran est actif)

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

  •  06-07-2019
  •  | 
  •  

Question

J'ai une application qui utilise beaucoup de graphiques et qui repose sur DirectX et Windows Forms. Il dispose d'un cadre d'automatisation et de relecture autour duquel est construit un système de test automatisé. Malheureusement, lorsque les tests sont exécutés sans surveillance pendant une construction nocturne, l'affichage est inactif ou lié à l'écran de veille, et nos politiques de sécurité informatique ne nous permettent pas de le désactiver.

Alors ma question: y at-il un moyen de faire un "écran"? capture d'une application qui s'exécute sans l'affichage? Je souhaite m'assurer que la carte graphique est bien utilisée pour que mon pipeline de rendu soit identique, mais le cadre de test ne devrait pas avoir à se soucier de l'état de l'affichage.

Toute aide follement appréciée!

Était-ce utile?

La solution

Puisque vous avez parlé du pipeline de rendu, je suppose donc que vous utilisez Direct3d. Si c'est le cas, vous pouvez enregistrer le backbuffer du cadre. Je l’ai fait quand j’utilisais encore VB.Net + MDX

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

Vous pouvez facilement convertir le langage de programmation de votre choix en appelant l'API de Direct3d. Cependant, vous devez configurer votre backbuffer et les paramètres Present comme

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

Autres conseils

Installez une machine virtuelle et exécutez l'application à cet effet. Si vous utilisez un économiseur d’écran, je doute que votre carte vidéo génère même l’interface graphique de l’application.

Si je comprends bien, tout ce que vous voulez, c'est effectuer une capture d'écran d'une application spécifique sans que le résultat soit affecté par un économiseur d'écran en cours d'exécution? Autant que je sache, le simple fait de GetDIBits sur le HDC de la fenêtre appropriée devrait faire l'affaire et ne pas se soucier de l'économiseur d'écran.

Vous trouverez peut-être que ce code est très lent, mais vous pouvez obtenir une accélération considérable en définissant le PresentParams.PresentFlag = PresentFlag.LockableBackBuffer

De plus, vous n'avez pas besoin de définir PresentInterval.One ou SwapEffect.Flip , ils peuvent être laissés à .Default et .Discard de manière représentative.

(Notez que cette accélération ne fonctionne pas si vous utilisez le multi-échantillonnage, assurez-vous que PresentParams.Multisample = Multisample.None . Si vous avez une carte Nvidia, vous pouvez toujours obtenir l'antialiasing en définissant l'option dans le panneau de configuration de Nvidia pour modifier les paramètres de l’application comme vous le souhaitez!)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top