Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Screenshot via DirectX erstellen bei Windows 7 (https://www.delphipraxis.net/156629-screenshot-via-directx-erstellen-bei-windows-7-a.html)

Langer 9. Dez 2010 09:40

Screenshot via DirectX erstellen bei Windows 7
 
Hallo,

ich hab ein kleines Tool programmiert dass Screenshot über DirectX erstellt. Unter Windows XP und Vista funktioniert dies perfekt. Dann habe ich das Tool einen Bekannten gegeben. Er hat Windows 7. Als er ein Spiel spielte (in dem Fall war es Counter Strike) wurden die Screenshots vom Desktop gemacht und nicht vom Spiel. Er war definitiv im Spiel.

In FormCreate erstelle ich den Device:
Delphi-Quellcode:
 
  mD := Direct3DCreate9(D3D_SDK_Version);

  ZeroMemory(@mDisplayMode, SizeOf(mDisplayMode));
  md.GetAdapterDisplayMode(0,mDisplayMode);

  ZeroMemory(@d3pp, SizeOf(d3pp));
  d3pp.SwapEffect := Direct3D9.D3DSWAPEFFECT_DISCARD;
  d3pp.hDeviceWindow := Handle;
  d3pp.BackBufferCount := 1;
  d3pp.Windowed := True;
  d3pp.BackBufferWidth := mDisplayMode.Width;
  d3pp.BackBufferHeight := mDisplayMode.Height;
  d3pp.BackBufferFormat := mDisplayMode.Format;

  d3pp.MultiSampleType := D3DMultisample_NONE;
  d3pp.EnableAutoDepthStencil := False;
  d3pp.PresentationInterval := D3DPresent_Interval_Default;


  mResult := mD.CreateDevice(D3DADAPTER_DEFAULT,
        Direct3D9.D3DDEVTYPE_HAL,
        Handle,
        Direct3D9.D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        @d3pp,mDev);

  if (mDev = nil) then begin
    ShowMessage('Fehler beim Starten. Der Device konnte nicht erstellt werden');
    exit;
  end;
In einem Timer wird der Screenshot erstellt
Delphi-Quellcode:
  try
    mDev.Reset(Self.d3pp);
    mDev.CreateOffscreenPlainSurface(
                        mDisplayMode.Width,mDisplayMode.Height,
                        Direct3D9.D3DFMT_A8R8G8B8,Direct3D9.D3DPOOL_SCRATCH,mSurf,0);

    mDev.GetFrontBufferData(0,mSurf);
    D3DX9.D3DXSaveSurfaceToFile(Pchar('.\Bild' + IntToStr(i) + '.jpg'),
                                        D3DX9.D3DXIFF_JPG,mSurf,0,0);
    inc(i);
    Result := True;
  except
    Result := False;
  end;
Wie schon erwähnt funktioniet dies unter Windows XP und Vista. Leider nur nicht unter Windows 7. Hat jemand eine Idee woran das liegt?

Gruß

Medium 9. Dez 2010 16:12

AW: Screenshot via DirectX erstellen bei Windows 7
 
Win7 betreibt standardmäßig den gesamten Desktop im DX Modus.

Langer 10. Dez 2010 06:21

AW: Screenshot via DirectX erstellen bei Windows 7
 
Über welchen Wege kann man dann unter Win 7 Screenshot erstellen? Gibt es dann eine Möglichkeit?

Langer 20. Dez 2010 09:47

AW: Screenshot via DirectX erstellen bei Windows 7
 
??? Gibt es keine Möglichkeit? Hat keiner eine Idde?
Ich such schon seit Tagen danach. Aber ich finde keine Lösung. Ich finde immer nur die Lösung dass man über die DirectX Screenshots machen soll. Dass mach ich doch.

Ich bitte um Hilfe!

Medium 20. Dez 2010 10:32

AW: Screenshot via DirectX erstellen bei Windows 7
 
Spontan würde ich sagen: Gewünschtes Fester per Handle bzw. Titel suchen, und den Gesamtscreenshot auf dessen Client-Area beschneiden. Der Inhalt sollte ja drin sein. Für Fullscreen-Anwendungen natürlich Käse.
Man sieht in deinem Code leider nicht, woher "Handle" bestückt wird. Unter Umständen könnte es schon reichen, dort das Handle des gesuchten Fensters einzutragen. Die Zeile "md.GetAdapterDisplayMode(0,mDisplayMode);" sieht auch nach erstem Parameter=Handle aus, und der HDC des Desktops wäre 0. Hier dann evtl. den DC vom Zielfenster einsetzen.
Beides ist mangels Informationen* aber auch nur geschätzt.

*Welche Lib setzt du ein, bzw. wie sind die Parameterlisten der jeweiligen Methoden die du aufrufst?

Langer 20. Dez 2010 11:07

AW: Screenshot via DirectX erstellen bei Windows 7
 
Danke für deine Antwort.

Es gibt eine DirectX SDK von Mircosoft (http://msdn.microsoft.com/en-us/directx/default.aspx)
Dies habe ich installiert und benutz somit die Klasse Direct3D9, Direct3D und D3DX9.

Zitat:

Unter Umständen könnte es schon reichen, dort das Handle des gesuchten Fensters einzutragen
Das ist eine gute Idee. Werde ich gleich testen bzw. dem Bekannten geben. Dann kann er es testen. Denn ich hab kein Win 7.

Gruß
Michael

Medium 20. Dez 2010 13:03

AW: Screenshot via DirectX erstellen bei Windows 7
 
Beim DX SDK sind mittlerweile Delphi Header-Konvertierungen dabei? :shock:

Sherlock 20. Dez 2010 15:44

AW: Screenshot via DirectX erstellen bei Windows 7
 
Zitat:

Zitat von Medium (Beitrag 1069546)
Beim DX SDK sind mittlerweile Delphi Header-Konvertierungen dabei? :shock:

Das wär mir neu....Wo siehst du das?

Sherlock

Neutral General 20. Dez 2010 15:45

AW: Screenshot via DirectX erstellen bei Windows 7
 
Zitat:

Zitat von Sherlock (Beitrag 1069590)
Zitat:

Zitat von Medium (Beitrag 1069546)
Beim DX SDK sind mittlerweile Delphi Header-Konvertierungen dabei? :shock:

Das wär mir neu....Wo siehst du das?

Ich schätze er bezieht sich auf folgendes Zitat:

Zitat:

Zitat von Langer
Es gibt eine DirectX SDK von Mircosoft (http://msdn.microsoft.com/en-us/directx/default.aspx)
Dies habe ich installiert und benutz somit die Klasse Direct3D9, Direct3D und D3DX9.


Langer 26. Dez 2010 09:28

AW: Screenshot via DirectX erstellen bei Windows 7
 
Sorry dass ich mich jetzt erst melde. Aber mein Bekannter hat mir erst jetzt sein Feedback gegeben. Leider hast es nicht mit dem Handle geklappt. Also ich hab das Handle vom Programm (in dem Beispiel CS) übergeben.
Éntweder bin ich blind oder gibt es wirklich keine Information im Internet darüber?

Ich bin echt am verzweifeln. :(

Gruß
Langer

Medium 26. Dez 2010 15:42

AW: Screenshot via DirectX erstellen bei Windows 7
 
Noch ein Blindschuss: Das Window-Handle ist imho nicht mit dem HDC identisch. Welcher dort ggf. erwartet wird weiss ich nicht, aber vielleicht mal das jeweils andere auch noch probieren :)

Langer 27. Dez 2010 11:22

AW: Screenshot via DirectX erstellen bei Windows 7
 
Ok, habe ich jetzt umgesetzt und hab es den Bekannten geschickt. Nun warte ich auf Antwort von ihm.
Aber vielen Dank noch für den Rat. Hoffe dass es jetzt endlich klappt.

Gruß
Langer

Hobby-Programmierer 27. Dez 2010 17:13

AW: Screenshot via DirectX erstellen bei Windows 7
 
Warum stellst du die zu testende Function\Prozedur nicht hier ins Forum ? Die 'Profis' können erstens drüberschauen und und ein Feedback erhälst du hier auch schneller.

lbccaleb 27. Dez 2010 17:42

AW: Screenshot via DirectX erstellen bei Windows 7
 
Hat er doch?! Schau mal im ersten Post nach!

Medium 27. Dez 2010 19:58

AW: Screenshot via DirectX erstellen bei Windows 7
 
Ohne Wissen um die verwendete Header-Konversion ist der Code leider nicht soooo irre hilfreich. Zumindest die Signaturen wären schon nicht unwichtig, und die dazu gestellte Nachfrage war leider nicht passend beantwortet. Daher schießen wir noch ein wenig in der Luft rum ;)

Hobby-Programmierer 27. Dez 2010 23:12

AW: Screenshot via DirectX erstellen bei Windows 7
 
Zitat:

Zitat von lbccaleb (Beitrag 1070657)
Hat er doch?! Schau mal im ersten Post nach!

Ich meinte damit den kompletten und aktuellen Code.

Langer 4. Jan 2011 11:19

AW: Screenshot via DirectX erstellen bei Windows 7
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich war im Urlaub deswegen schreib ich jetzt erst. sry

Leider hat des mit dem Handle nicht funktioniert.
Aber vielen Dank für eure Mühe und den Vorschlag mein Quelltext hochzuladen.
Das habe ich jetzt gemacht.
Kurz zum Programmablauf:
In FormCreate steht welches Programm bzw. welcher Prozess überwacht wird. Testweise steht bei mir notepad.exe. Wenn dieser Prozess läuft dann werden Screenshots erstellt. Die Bilder werden in demselben Ordner gespeichert in der auch die Exe liegt.

Wie schon erwähnt benutze ich das DirectX SDK von Microsoft (http://msdn.microsoft.com/en-us/directx/default.aspx)


Vielen, Vielen Dank schonmal für eure Mühe!

hathor 4. Jan 2011 12:04

AW: Screenshot via DirectX erstellen bei Windows 7
 
Das Programm bleibt gleich mit einem D3DERR_INVALIDCALL stehen.

Medium 4. Jan 2011 22:37

AW: Screenshot via DirectX erstellen bei Windows 7
 
Okay, ein letztes Mal: Die Units Direct3D9, Direct3D und D3DX9 sind genau das, wonach ich gefragt hatte. Diese sind nicht mit in deiner zip-Datei, und dies sind genau die Header-Konversionen nach denen ich fragte. Und sie sind ziemlich sicher NICHT Bestandteil des MS DX SDKs. Ganz sicher sogar, ich hab nämlich grad noch mal in meins rein geschaut.

lbccaleb 5. Jan 2011 05:28

AW: Screenshot via DirectX erstellen bei Windows 7
 
http://www.clootie.ru/delphi/index.html

Langer 5. Jan 2011 09:00

AW: Screenshot via DirectX erstellen bei Windows 7
 
Liste der Anhänge anzeigen (Anzahl: 1)
Naja als ich das SDK installiert habe, bekam ich auch die PAS-Dateien.
Aber ist auch egal ich hab jetzt die PAS-Datein im Anhang. Die sind jetzt für Delphi 6 und Delphi 7.

Langer 10. Jan 2011 08:39

AW: Screenshot via DirectX erstellen bei Windows 7
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich hab mal eine Bitte an alle die Windows 7 haben:

Könnt ihr bitte mein Screenmaker testen ob der unter Windows 7 Screenshots macht? Also die Bilder werden in demselben Verzeichniss erstellt in der auch die Exe liegt.
Wenn man in einem Spiel ist, sollte Screenshots vom Spiel und nicht vom Desktop erstellt werden.

Vielen Dank im Voraus

PS. Bitte schreibt dazu ob ihr 32 oder 64 bit habt.

Gruß
Langer

lbccaleb 10. Jan 2011 23:27

AW: Screenshot via DirectX erstellen bei Windows 7
 
Woher nimmt denn dein Programm das Recht, die Screenshots im selben Verzeichnis zu erstellen?

Kann es sein das die da bei Windows 7 geblockt werden, da das Programm keine schreibrechte hat?

Langer 11. Jan 2011 06:33

AW: Screenshot via DirectX erstellen bei Windows 7
 
Guter Hinweis!

Dies habe ich nur testweise. Also in erster Linie wäre es mir wichtig das kein Screenshots vom Desktop sondern vom "tatsächlichen" Bild erstellt wird. Also bei dem Testprogramm müsste man evtl. als Admin starten (rechte Maustaste "Als Administrator starten") Denn dass ist auch ein Thema für sich.
Nur ich habe überhaupt kein Ansatz, wie "richtige" Screenshots erstellt werden. Im Internet finde ich nur die Lösung (Über die DirectX) als die richtige.

veX 15. Feb 2011 11:47

AW: Screenshot via DirectX erstellen bei Windows 7
 
bei mir macht dein programm nur bilder vom cs menu (als admin) oder von desktop/cs menu abwechselnd (normal gestartet).

wenn du das mittlerweile gelöst hast, sag mal bescheid und poste wie, bräuchte das auch für mein screenshot tool :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz