Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Screenshot unter DirectX 11 Windows 7/64 Bit (https://www.delphipraxis.net/150813-screenshot-unter-directx-11-windows-7-64-bit.html)

ALTF4 27. Apr 2010 22:54


Screenshot unter DirectX 11 Windows 7/64 Bit
 
Mein kleines Screenshot Programm für Spiele funktioniert leider unter DirectX-11 bzw. Windows 7/64 Bit nicht mehr. Es werden nur noch weise Bilder gemacht...

Basis für die Screenshots ist

Delphi-Quellcode:
procedure ScreenToFile(aFileName: string);
var
  Bitmap: TBitmap;
  Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;
  try
    Canvas.Handle := GetWindowDC(0);
    try
      Bitmap := TBitmap.Create;
      try
        Bitmap.Width := Screen.DesktopWidth;
        Bitmap.Height:= Screen.DesktopHeight;
        Bitmap.PixelFormat := pfDevice;
        BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred(
            Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft,
            Screen.DesktopTop, Bitmap.Canvas.CopyMode);
        Bitmap.SaveToFile(aFileName);
      finally
        Bitmap.Free;
      end;
    finally
      ReleaseDC(0, Canvas.Handle);
    end;
  finally
    Canvas.Free;
  end;
end;
von hier.

Unter XP/Vista DirectX 9 ging das noch. Wie kann ich nun Screenshots von DirectX-11 bzw. Windows 7/64 Bit machen?

BerndS 28. Apr 2010 10:31

Re: Screenshot unter DirectX 11 Windows 7/64 Bit
 
Hallo,

habe das gerade mal bei mir W7 prof 64bit Directx 11.0 (GeForce 9500 GS 197.13) getestet und habe eine BMP mit dem Inhalt des gesamten Desktops (1920x1200 + 1280x1024).
Ich habe den 2.Bildschirm auch mal links, oben und rechts verschoben. Klappt alles....

Gruß Bernd.

ALTF4 28. Apr 2010 13:04

Re: Screenshot unter DirectX 11 Windows 7/64 Bit
 
Hallo und Danke für die Rückmeldung.

Welches DirectX 11 Spiel lief während des Screenshots im Vordergrund?

Medium 28. Apr 2010 13:10

Re: Screenshot unter DirectX 11 Windows 7/64 Bit
 
Dass du überhaupt über den DC 0 (Desktop) einen Screenie bekommen hast, ist eher als Glücksfall zu bewerten. Prinzipiell ist die einzige "ordentliche" Methode, DX Funktionen zu Hooken, und darin via DX selbst den Bildpuffer abzuholen. DLL Hooking bzw. API Hooking sind hier ganz gute Recherchestarter.

BerndS 28. Apr 2010 13:15

Re: Screenshot unter DirectX 11 Windows 7/64 Bit
 
:oops:
Oh Mist, da habe ich wohl etwas wichtiges überlesen.
Habe das nicht mir einem Spiel getestet, werde das aber nachher mal nachholen...

TKC 28. Apr 2010 14:29

Re: Screenshot unter DirectX 11 Windows 7/64 Bit
 
Hallo,
ich benutze sa immer folgendes ..

Delphi-Quellcode:
const
  PW_CLIENTONLY = 1;

var
  PrintWindow: function(sHandle: HWND; dHandle: HDC; nFlags: UINT): BOOL; stdcall;



function Screenshot(wnd: HWND; const bmp: TBitmap32): Boolean;
var
  rec: TRect;
begin

  GetClientRect(wnd, rec);
  bmp.SetSize((rec.Right - rec.Left), (rec.Bottom - rec.Top));

  bmp.Canvas.Lock;
  try
    Result := PrintWindow(wnd, bmp.Canvas.Handle, PW_CLIENTONLY);

  finally
    bmp.Canvas.Unlock;
  end;
end;

initialization
  @PrintWindow := GetProcAddress(LoadLibrary('user32.dll'), 'PrintWindow');
ist zwar für GR32 kann aber leicht angepasst werden.

Medium 28. Apr 2010 14:40

Re: Screenshot unter DirectX 11 Windows 7/64 Bit
 
Auch das wird bei Overlays (was u.a. DirectX teilweise nutzt) nicht immer zum gewünschten Ergebnis führen. Man muss einfach bedenken, dass Windows an und für sich im Normalfall überhaupt keine Kenne von dem Dargestellten hat, da es an sämtlichen "normalen" APIs für die Anzeige vorbei geführt wird, und in der Folge DirectX->Treiber->Hardware kommuniziert wird, nicht wie sonst WinAPI->GDI->HAL->Treiber->Hardware. Wenn man nun also Ergebnisse aus WinAPI/GDI Calls bekommt, liegt das nur daran, dass irgendwo mitten drin Spiel oder Windows selbst irgendwo auf diese zurückgegriffen haben.

Ein Beispiel: Ich habe von World of Warcraft mit der DC(0)-Methode problemlos Screenshots machen können - solange es im Windowed-Mode lief! Sobald es in Vollbild war, sind offenbar ein paar Umwege über die WinAPI weg gefallen, und alles was dann noch kam war schwarz, oder manchmal irgendwelche Reste die noch im Framebuffer rumlagen.

Daher: Der einzig sicher zum Ziel führende Weg ist das Hooking. Alles was irgendwie über "normale" Windows-Calls läuft kann klappen, wird es aber nicht immer bzw. selten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr.

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