Screenshot aus einem Spiel (Directx usw) erstellen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Ruffo.

    Screenshot aus einem Spiel (Directx usw) erstellen

    Hey leute, ich hab mal ne frage an euch :D Also, ich hatte vor mir eine Spielrecoderfunktion zu erstellen. Also:

    Bsp: CS:GO oder CSS, das Spiel leuft, man drückt eine Taste, ein Timer startet, Drück die Maustaste(womit der Zuschaue Spieler ja gewechselt wird) nach diesem Klick wird direct ein screenshot erstellt und unter ordner 1 gespeichert. Nächster Klick ordner 2 usw.

    Jz muss ich es nurnoch Hinkriegen wie ich diesen Screenshot speicher. Mit

    VB.NET-Quellcode

    1. g.CopyFromScreen
    geht das nicht, das die meisten Spiele auf DirectX Basieren.. Jetzt würde ich trotzdem gerne von euch wissen wie das geht :)

    mfg Ruffo
    Der Grund ist wie schon tausend mal gesagt das mit Screenshots nicht geht.
    Ob du nun in C++, VB.NET über GDI+ oder über die Drucktaste einen Screenshot machst ist dabeit total egal, da es immer auf die selben WinAPI's rausläuft.
    Das heißt egal was du machst solange es ein normaler Screenshot ist macht das immer Windows.
    Das Problem bei der Ganzen Sache ist es, dass Spiele oft mit DX oder OpenGL funktionieren.

    Da gerade Spiele eine extrem hohe Performance brauchen ist der übliche Zugriff auf Hardware nicht schnell genug, denn für normal steht zwischen Prozess und Hardware noch Windows dazuwischen und leitet das Ganze praktisch weiter. Dies hat natürlich sehr viele Vorteile, da es auch einen gewissen Schutz bietet, dass man nicht irgendwas falsches mit der Hardware anstellt und der Rechner abstürzt.
    Wie bereits gesagt haben aber das Spielehersteller nicht so akzeptieren wollen und sagen wir können gut selbst darauf aufpassen, dass wir nix kaputt machen.

    Daraus ist DX und OpenGL entstanden welche beide Windows einfach stehen lassen und direkt auf die Hardware gehen.
    Dadurch bekommt natürlich auch Windows absolut nichts von dem Zeichenprozess mit, da Windows einfach über der Hardware steht aber nicht sieht was darin vorgeht. Bei Buttons und so weiter ist das anders, da diese alle über GDI... gezeichnet werden welches eben Windows übernimmt und somit auch weiß was es gezeichnet hat und das somit auch auf ein Bild zeichnen kann.

    Fazit:
    Normale Screenshots werden von Windows gemacht. Windows weiß nichts von den Zeichenprozessen von Windows. Windows kann somit nicht wissen was gezeichnet wurde und kann somit auch das nicht auf einem Bild festhalten.
    Lösung:
    Hardware und Prozess (Spiel-Prozess) wissen was gezeichnet wird. An die Hardware kommen... naja nicht die beste Idee.
    --> An den Prozess kommen schon leichter aber NICHT leicht. Du musst dich via DLL-Injection einklinken und praktisch "mithören".


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hat das Spiel vielleicht einen HotKey, der einen Screenshot in die Zwischenablage kopiert?
    Wenn ja, könntest Du diese Funktion mit SendKeys aktivieren und danach die Zwischenablage auslesen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!