![]() |
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:
von
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; ![]() Unter XP/Vista DirectX 9 ging das noch. Wie kann ich nun Screenshots von DirectX-11 bzw. Windows 7/64 Bit machen? |
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. |
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? |
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.
|
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... |
Re: Screenshot unter DirectX 11 Windows 7/64 Bit
Hallo,
ich benutze sa immer folgendes ..
Delphi-Quellcode:
ist zwar für GR32 kann aber leicht angepasst werden.
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'); |
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 19:38 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