Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi windows vista und screenshots (https://www.delphipraxis.net/87343-windows-vista-und-screenshots.html)

Arnulf 27. Feb 2007 13:02


windows vista und screenshots
 
ich hab glaub ich etwas verpennt...

ich mache screenshots vom desktop speziell von einem spiel
allerdings dürften bei vista usern nur noch leere screenshots kommen.
das game läuft unter opengl.
ist es mit vista nicht mehr normal möglich daraus screenshots zu bekommen?
die methode schaut so aus:

Delphi-Quellcode:
  hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
  hdcCompatible := CreateCompatibleDC(hdcScreen);

  hbmScreen := CreateCompatibleBitmap(hdcScreen,
    GetDeviceCaps(hdcScreen, HORZRES),
    GetDeviceCaps(hdcScreen, VERTRES));

  SelectObject(hdcCompatible, hbmScreen);
  bmp.Handle := hbmScreen;
  BitBlt(hdcCompatible,
    0, 0,
    bmp.Width, bmp.Height,
    hdcScreen,
    0, 0,
    SRCCOPY or CAPTUREBLT);
  DeleteDC(hdcScreen);
  DeleteDC(hdcCompatible);
und ja es ist eigentlich absicht, dass ich screenshots vom ganzen desktop erzeuge.

lg
Arnulf

Christian Seehase 27. Feb 2007 17:33

Re: windows vista und screenshots
 
Moin Arnulf,

hast Du schon mal daran gedacht die Rückgabewerte der Funktionen auf Gültigkeit zu prüfen, im das Problem einkreisen zu können?

BTW:
Es fehlt auch noch ein DeleteObject für das Compatible-Bitmap.

[EDIT]
Ich habe es mit dem folgenden Code mal unter Vista ausprobiert, und bekomme einen Screenshot (nicht leer versteht sich).
Leider kann ich aber nicht ausprobieren, wie's mit OpenGL aussieht.

Delphi-Quellcode:
const
  CAPTUREBLT = $40000000;

var
  hdcScreen    : DWORD;
  hdcCompatible : DWORD;
  hbmScreen    : DWORD;
  bmp          : TBitmap;

begin
  bmp := TBitmap.Create;
  try
    hdcScreen    := CreateDC('DISPLAY', nil, nil, nil);
    if hdcScreen = 0 then begin
      ShowMessage('CreateDC: '+SysErrorMessage(GetLastError));
      Exit;
    end;
    try
      hdcCompatible := CreateCompatibleDC(hdcScreen);
      if hdcCompatible = 0 then begin
        ShowMessage('CreateCompatibleDC: '+SysErrorMessage(GetLastError));
        Exit;
      end;
      try
        hbmScreen := CreateCompatibleBitmap(hdcScreen,GetDeviceCaps(hdcScreen, HORZRES),GetDeviceCaps(hdcScreen, VERTRES));
        if hbmScreen = 0 then begin
          ShowMessage('CreateCompatibleBitmap: '+SysErrorMessage(GetLastError));
          Exit;
        end;
        try
          SelectObject(hdcCompatible, hbmScreen);
          bmp.Handle := hbmScreen;
          BitBlt(hdcCompatible,
            0, 0,
            bmp.Width, bmp.Height,
            hdcScreen,
            0, 0,
            SRCCOPY or CAPTUREBLT);
            bmp.SaveToFile('c:\temp\Screenshot.bmp');
          finally
            DeleteObject(hbmScreen);
          end;
      finally
        DeleteDC(hdcCompatible);
      end;
    finally
      DeleteDC(hdcScreen);
    end;
  finally
    FreeAndNil(bmp);
  end;
end;
[/EDIT]

Arnulf 27. Feb 2007 21:29

Re: windows vista und screenshots
 
Hallo
Also freigeben tu ich das bitmap wo anders - ich habs ja auch nicht in der funktion erzeugt.
Ansonsten seh ich nicht so ganz den unterschied zwischen deiner funktion und der die ich verwende...

Das wirkliche problem ist, ich kanns nicht testen :).
Ich hab nur den hinweis bekommen, dass screenshots in meinem Programm manchmal nicht korrekt funktionierten und das es scheinbar bei visa probleme gab.

Deshalb hab ich einmal gefragt.

Das ganze mit try - except zu machen könnte ich mal versuchen.
Vor allem eine Fehlerprüfung könnte meine funktion tatsächlich vertragen .... das werde ich mal versuchen.

Es gab ja glaub ich auch schon unter XP bei so manchen player mit den screenshots probleme die spezielle overlays verwendet haben ( xv glaub ich oder irgendwelche direkt x ).
Ich dachte nur einmal gehört zu haben, dass es in vista garnicht mehr möglich sein soll von videos oder ähnlichem screenshots zu machen - kann aber auch ein gerücht sein....

lg
Arnulf

Christian Seehase 27. Feb 2007 21:35

Re: windows vista und screenshots
 
Moin Arnulf,

einen "echten" Unterschied gibt es zwischen Deiner und meiner Version auch nicht, und bei mir geht es, wie gesagt.
Auch wenn das CAPTUREBLT hier Abhilfe schaffen soll:
Das funktioniert bei mir unter XP auch nur rudimentär, wenn ich es mal mit dem Screenshot eines Videos versuche.

Dafür ist vielleicht das Hier im Forum suchenDSPACK / Bei Google suchenDSPACK besser geeignet.
Unter Vista habe ich das allerdings auch noch nicht ausprobiert.

Arnulf 28. Feb 2007 14:14

Re: windows vista und screenshots
 
Ich glaub dspack ist nur für die eigene anwendung gut ( hab keine erfahrung damit ).
von einer anderen andwendung werde ich vermutlich den kontext nicht so leicht bekommen und deshalb wohl auch
nicht auf die grafik zugreifen können.

Hab sowas mal mit opengl probiert :) - einen hook auf swapbuffer gemacht und mir einige bilder gespeichert.
So ähnlich dürfte das auch das programm fraps machen.
aber ich hatt immer wieder abstürze also hab ichs gelassen.

ich werd wohl etwas abwarten bis das mit vista etwas kongreter wird - gott sei dank verwendet das noch kaum jemand. - und es schaut ja doch nicht so aus als wäre das ein vista problem.

werd mal ein fehler log mitschreiben lassen welches mir die leute dann schicken sollen wenns probleme gibt ....

Danke jedenfalls.

lg
Arnulf

Christian Seehase 28. Feb 2007 17:16

Re: windows vista und screenshots
 
Moin Arnulf,

ich hatte es so verstanden, dass Du den ScreenShot von einem Video machen wolltest, und das würde mit dem DSPACK wahrscheinlich funktionieren.
So ein ähnliches Problem hatte ich auch schon einmal, und bekam als Lösungsansatz die Idee, den Overlaymodus abzuschalten, habe diese Idee dann aber nicht weiterverfolgt, da ich mir mit dem DSPACK helfen konnte.
Eventuell lässt sich der Overlaymodus temporär, eben für den Screenshot, abschalten.
Wege wie das überhaupt geht, kann ich Dir leider nicht anbieten.

BTW:
Und nicht vergessen die Routine um Fehlerprüfung, Resourcenschutzblöcke und DeleteObject zu ergänzen ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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