Hallo liebe Coder,
ich hab ein Problem mit der Erstellung eines Programms. Ich möchte gerne Screenshots eines Spiels anlegen (Microsoft Flight Simulator X/FSX) und diese dann auf der Festplatte speichern.
Ich habe schon dieser "Standardmethode " ausprobiert und es funktionierte auch wunderbar auf allen getesteten Programmen (Notepad, Windows Explorer,...). Dann wollte ich mein Programm umbauen um es dann so einzustellen damit es nur das FSX-Fenster speichert. Nachdem ich ein bisschen herumprobiert hatte und verschiedene Möglichkeiten ausprobiert hatte, hat mich dieser Code am meisten zufrieden gestellt (da ich alles zuerst mit Notepad/Windows Explorer,... teste). Nachdem ich das ganze dann mit dem FSX testete ging es nicht und nach etwas Google Recherche war das Problem auch schnell gefunden: DirectX geht den Weg direkt über die Grafikkarte anstatt nochmal mit Windows zu reden. Deshalb kann ich also keine Screenshots von einem Spiel machen. Danach stellte ich mein Programmieren für ein paar Tage ein um mich eingehend mal mit dem Thema zu beschäftigen und Alternativen zu finden. Microsoft bietet ja laut meiner Recherche eine Hilfe an zum Schnäppchenpreis von knappen 10000€ was ich aber heute nun nicht gerne ausgeben will
Dann habe ich nach etwas Recherche eine Anleitung gefunden nachdem diese DirectX Hook (hoffe das heisst jetzt so..) Methode nur geht wenn man ein Framework unter 4 (ich nahm 3.5) und eine X86 CPU auswählt. (Informationen hab ich von hier). Alles also eingestellt wie es sein soll und auch den Code so programmiert wie er eigentlich sein sollte. Hier dann mal mein Code:
Natürlich hab ich auch nicht die Namespace(s) vergessen:
und ja nun sagt mir VS Express 2012 folgendes:
- "DirectX" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
- Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.
- Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.
Laut Google muss man da eine Instanz einstellen/generieren aber bevor ich daran wieder jetzt rumpfusche wollte ich erst einmal fragen ob ich alles bisher richtig gemacht hab?
Vielen Danke für eure Hilfe!
ich hab ein Problem mit der Erstellung eines Programms. Ich möchte gerne Screenshots eines Spiels anlegen (Microsoft Flight Simulator X/FSX) und diese dann auf der Festplatte speichern.
Ich habe schon dieser "Standardmethode " ausprobiert und es funktionierte auch wunderbar auf allen getesteten Programmen (Notepad, Windows Explorer,...). Dann wollte ich mein Programm umbauen um es dann so einzustellen damit es nur das FSX-Fenster speichert. Nachdem ich ein bisschen herumprobiert hatte und verschiedene Möglichkeiten ausprobiert hatte, hat mich dieser Code am meisten zufrieden gestellt (da ich alles zuerst mit Notepad/Windows Explorer,... teste). Nachdem ich das ganze dann mit dem FSX testete ging es nicht und nach etwas Google Recherche war das Problem auch schnell gefunden: DirectX geht den Weg direkt über die Grafikkarte anstatt nochmal mit Windows zu reden. Deshalb kann ich also keine Screenshots von einem Spiel machen. Danach stellte ich mein Programmieren für ein paar Tage ein um mich eingehend mal mit dem Thema zu beschäftigen und Alternativen zu finden. Microsoft bietet ja laut meiner Recherche eine Hilfe an zum Schnäppchenpreis von knappen 10000€ was ich aber heute nun nicht gerne ausgeben will
Dann habe ich nach etwas Recherche eine Anleitung gefunden nachdem diese DirectX Hook (hoffe das heisst jetzt so..) Methode nur geht wenn man ein Framework unter 4 (ich nahm 3.5) und eine X86 CPU auswählt. (Informationen hab ich von hier). Alles also eingestellt wie es sein soll und auch den Code so programmiert wie er eigentlich sein sollte. Hier dann mal mein Code:
VB.NET-Quellcode
- Public Function CaptureScreenshot(ByVal Device As Direct3D.Device, ByVal Filename As String, ByVal ImageFormat As Direct3D.ImageFileFormat) As Boolean
- Dim B As Direct3D.Surface
- Try
- B = Device.GetBackBuffer(0, 0, DirectX.Direct3D.BackBufferType.Mono)
- Direct3D.SurfaceLoader.Save(Filename, ImageFormat, B)
- B.Dispose()
- Catch ex As Exception
- Return False
- End Try
- Return True
- End Function
- Public Shared Function CaptureScreenshot(ByVal Device As Direct3D.Device, ByVal Filename As String) As Boolean
- Return CaptureScreenshot(Device, Filename, Direct3D.ImageFileFormat.Bmp)
- End Function
Natürlich hab ich auch nicht die Namespace(s) vergessen:
und ja nun sagt mir VS Express 2012 folgendes:
- "DirectX" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
- Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.
- Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.
Laut Google muss man da eine Instanz einstellen/generieren aber bevor ich daran wieder jetzt rumpfusche wollte ich erst einmal fragen ob ich alles bisher richtig gemacht hab?
Vielen Danke für eure Hilfe!
cheers Kevin
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Springbok“ ()