![]() |
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:
und ja es ist eigentlich absicht, dass ich screenshots vom ganzen desktop erzeuge.
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); lg Arnulf |
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:
[/EDIT]
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; |
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 |
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 ![]() ![]() Unter Vista habe ich das allerdings auch noch nicht ausprobiert. |
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 |
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 10:23 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 by Thomas Breitkreuz