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]