Windows Forms: Bildschirmerfassung bei der Ausführung von nicht-grafisch (das heißt Bildschirmschoner aktiv ist)

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe eine Anwendung, die sehr grafikintensive und gebaut auf DirectX und Windows Forms ist. Es verfügt über eine Automatisierung und Replay-Rahmen, um die sich ein automatisiertes Testsystem aufgebaut ist. Leider, wenn die Tests während einer nächtlichen Build unbeaufsichtigt laufen, wird die Anzeige inaktiv ist oder mit dem Bildschirmschoner gebunden, und unsere IT-Sicherheitsrichtlinien erlauben uns nicht, dass zu deaktivieren.

Also meine Frage: Gibt es eine Möglichkeit, einen „Bildschirm“ capture eine Anwendung zu tun, ohne die Anzeige läuft? Ich möchte sicherstellen, dass die Grafikkarte so eingreift, dass meine Rendering-Pipeline ist die gleiche, aber der Test-Framework sollte nicht brauchen, um über den Zustand der Anzeige sorgen.

Jede Hilfe wild geschätzt!

War es hilfreich?

Lösung

Da Sie Rendering-Pipeline erwähnt, so dass ich nehme an, Sie verwenden Direct3d, wenn dies der Fall, können Sie den Backbuffer des Rahmens speichern. Ich wusste, dass, wenn ich immer noch mit VB.Net + MDX

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

Sie können ganz einfach, die jede Programmiersprache Ihrer Wahl tun umgewandelt, es ist im Grunde Direct3d API aufrufen. Obwohl, müssen Sie Sie Backbuffer und Gegenwart Parameter wie

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

Andere Tipps

eine VM installieren und die Anwendung in dem läuft. Wenn Sie einen Bildschirm laufen Schoner Ich bezweifle die Grafikkarte auch die GUI für die Anwendung generiert.

Wenn ich richtig verstehe, alles, was Sie wollen, ist ein Bildschirm Greifer einer bestimmten Anwendung übernehmen und das Ergebnis nicht haben durch einen möglicherweise laufen Bildschirmschoner betroffen sein? Soweit ich weiß, einfach GetDIBits auf dem HDC des richtigen Fensters tun sollte es tun und nicht über den Bildschirmschoner sorgen.

Sie können diesen Code finden wirklich langsam sein, aber können Sie eine massive Beschleunigung erhalten, indem die PresentParams.PresentFlag = PresentFlag.LockableBackBuffer Einstellung

Auch Sie brauchen nicht PresentInterval.One oder SwapEffect.Flip zu setzen, können sie bei .Default und .Discard repsectively gelassen werden.

(Beachten Sie, dass diese Beschleunigung nicht funktioniert, wenn Sie Multi-Sampling verwenden, sicher sein, dass PresentParams.Multisample = Multisample.None. Wenn Sie eine Nvidia-Karte haben, können Sie immer noch Anti-Aliasing erhalten, indem Sie die Option in der Nvidia Systemsteuerung die Einstellung der Anwendungseinstellung auf das, was Sie außer Kraft setzen will!)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top