AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Screenshot unter DirectX 11 Windows 7/64 Bit

Ein Thema von ALTF4 · begonnen am 27. Apr 2010 · letzter Beitrag vom 28. Apr 2010
Antwort Antwort
ALTF4
(Gast)

n/a Beiträge
 
#1

Screenshot unter DirectX 11 Windows 7/64 Bit

  Alt 27. Apr 2010, 23:54
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?
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#2

Re: Screenshot unter DirectX 11 Windows 7/64 Bit

  Alt 28. Apr 2010, 11:31
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.
  Mit Zitat antworten Zitat
ALTF4
(Gast)

n/a Beiträge
 
#3

Re: Screenshot unter DirectX 11 Windows 7/64 Bit

  Alt 28. Apr 2010, 14:04
Hallo und Danke für die Rückmeldung.

Welches DirectX 11 Spiel lief während des Screenshots im Vordergrund?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Screenshot unter DirectX 11 Windows 7/64 Bit

  Alt 28. Apr 2010, 14:10
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#5

Re: Screenshot unter DirectX 11 Windows 7/64 Bit

  Alt 28. Apr 2010, 14:15

Oh Mist, da habe ich wohl etwas wichtiges überlesen.
Habe das nicht mir einem Spiel getestet, werde das aber nachher mal nachholen...
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#6

Re: Screenshot unter DirectX 11 Windows 7/64 Bit

  Alt 28. Apr 2010, 15:29
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Screenshot unter DirectX 11 Windows 7/64 Bit

  Alt 28. Apr 2010, 15:40
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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