Screenshots mit DirectX

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von Nanco.

    Kay, vielen Dank, hab ich hingekriegt. Nun erhalte ich eine andere Fehlermeldung (siehe Anhang).
    Noch verwende ich nur diesen Code hier:

    Dim pSurface As Surface = dev.CreateOffscreenPlainSurface(Windows.Forms.Screen.PrimaryScreen.Bounds.Width, Windows.Forms.Screen.PrimaryScreen.Bounds.Height, Direct3D.Format.A8R8G8B8, Direct3D.Pool.Scratch)

    dev.GetFrontBufferData(0, pSurface)
    SurfaceLoader.Save("C:/testdx.bmp", ImageFileFormat.Bmp, pSurface)

    Wahrscheinlich kommt der Error deshalb, weil kein Device festgelegt ist? Ich weiß es nicht...
    MfG
    Bilder
    • nullreference.PNG

      48,95 kB, 1.908×327, 159 mal angesehen
    nimm PresentParameters...
    Flag->PresentFlag
    Direct§D , machst du aus dem Komma einen Punkt
    PresentationInterval nimmst du einfach mal weg...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke, keine Fehler mehr.
    Habe gleich getestet und es macht ein schönes Bild vom Bildschirm (ohne Spiel).
    Wenn ich jedoch versuche, einen Screenshot von einem Spiel selbst zu erstellen, minimiert es sich und ich bekomme folgende Meldung (siehe Anhang).
    Dennoch: Ich glaube, wir sind der Lösung des Problems ziemlich nahe.
    MfG
    Bilder
    • device_lost.PNG

      94,2 kB, 1.713×694, 171 mal angesehen
    auuu das ist gefährlich :P
    erstelle die Device bitte im Form_Load Event das erzeugen des Events benötigst du nur einmal...außerdem solltest du ihn denke ich Disposen, damit alles freigegeben wird...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Zwar keine Fehler, aber auf dem Screenshot ist wieder nur der Desktop zu sehen (man beachte den schwarzen Balken in der oberen linken Ecke, siehe Anhang). Ich glaube, dass wenn das Device gestartet wird, bevor das Spiel geöffnet ist, der Desktop das Device ist, daher der Screenshot vom Desktop. Oder ist es wegen dem Me.Handle (also das Handle des eigenen Fensters, nicht des Spiels)?
    Disposen ist doch, nicht verwendete Ressourcen aus dem RAM zu entfernen (falls mich Google richtig informiert hat), oder?
    MfG
    Bilder
    • testdx.jpg

      377,65 kB, 1.920×1.080, 180 mal angesehen
    ja es ist das Handle der aktuellen Form, aber das muss es auch sein...für das Spiel wurde ja bereits eine Device erstellt...
    die Methode GetBackBuffer gibt das was die Device an sich zeichnet...GetFrontBuffer zeichnet eigt. das auf was an den VGA ausgang gesendet wird...also was du auf dem Bildschirm siehst...mach am besten einen Timer, welcher einmalig einen Screenshot macht, am besten nach ca. einer minute, dann hast du genügend Zeit in das Spiel zu wechseln...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    das Spiel muss minimiert sein, wenn die Device erstellt wird, da diese ja von deinem eigenen Prog ist, evtl. solltest du deinem Programm doch noch eine Render Methode hinzufügen(ohne etwas wirklich zu zeichnen)...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Habe leider nicht den Hauch einer Ahnung, wie ich dem Programm eine Render-Methode hinzufüge... Google spuckt da ziemlich viele verschiedene Sachen aus.
    Ich weiß nur, wie ich Text mit GDI+ zeichne, das ist wahrscheinlich nicht sehr hilfreich^^
    MfG
    schreib ans Ende des Form_Load-Event einfach noch folgendes:

    VB.NET-Quellcode

    1. While Run
    2. dev.Clear(Target Or ZBuffer,Color.Black,1.0F,0.0F)
    3. dev.BeginScene()
    4. 'eigt würde man hier zeichnen...
    5. dev.EndScene()
    6. dev.Present()
    7. Application.DoEvents()
    8. End While

    Run ist eine Private Variable vom Typ Boolean mit dem Anfangswert True, ins Form Closing Event kommt noch folgendes:

    VB.NET-Quellcode

    1. If Run Then
    2. e.Cancel = True
    3. Run = False
    4. Me.Close()
    5. End If
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Run musst du deklarieren und wenn du den Code nicht abkopieren würdest, sondern abschreiben, dann würde dir VB die entsprechenden Vorschläge machen ;) ich weiß leider nicht auswendig was vor Target und ZBuffer hin gehört(ich glaube ClearFlags, bin mir aber nicht sicher, da kann man viel mit XNA verwechseln :P)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    ClearFlags war richtig, jo.
    Die einzigen Vorschläge sind Wörter, die mit "Runtime" beginnen. Kann mir kaum vorstellen, dass das stimmt. Dennoch habe ich "Run" als Boolean deklariert, du sagtest es sei eine Boolean-Variable :D
    Nun habe ich keine Fehler mehr im Code, aber der Screenshot ist noch immer ein Bild vom Desktop mit einem schwarzen Balken in der oberen linken Ecke.
    An dieser Stelle muss ich doch eine Frage stellen: Ist ein DirectX-Screenshot (bzw. ein Screenshot von einem DirectX-Spiel, denn das was wir bis jetzt haben, ist eigentlich ein DirectX-Screenshot) eigentlich möglich???
    MfG
    ja solch ein Screenshot sollte mit DirectX möglich sein ;)
    aber das so hier zu probieren ist sehr anstrengend(ohne Visual Studio) ich muss da ziemlich viel Googlen(hauptsächlich das was ich noch nie benutzt habe :P)...

    ich biete dir hier noch die Hilfe über TeamViewer an, dann guck ich mir die C++ Applikation nochmal genauer an, dann könnte man entsprechend probieren das gesamte zu übersetzen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---