Jupp, selbes Problem.
Bei mir ist auch alles nur Weiß.
Vom normalen/sichtbaren Desktop "default" klappt es, aber nicht bei einem nicht Sichtbaren
Delphi-Quellcode:
Procedure THandler.ScreenShot(Desktop: String; Stream: TStream; Quality: Byte = 100);
Var Desk: HDESK;
OldDesk: HDESK;
Canvas: TCanvas;
Bitmap: TBitmap;
Jpeg: TJPEGImage;
R: TRect;
Begin
Desk := OpenDesktop(PChar(Desktop), 0, False, DESKTOP_CREATEMENU
or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL
or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP
or GENERIC_WRITE);
OldDesk := GetThreadDesktop(GetCurrentThreadId);
SetThreadDesktop(Desk);
Try
Jpeg := TJPEGImage.Create;
Try
Bitmap := TBitmap.Create;
Try
Canvas := TCanvas.Create;
Try
Canvas.Handle := GetWindowDC(GetDesktopWindow);
R := Rect(0, 0, Screen.Width, Screen.Height);
Bitmap.Width := Screen.Width;
Bitmap.Height := Screen.Height;
Bitmap.Canvas.CopyRect(R, Canvas, R);
Finally
ReleaseDC(0, Canvas.Handle);
Canvas.Free;
End;
//Image.Width := Bitmap.Width;
//Image.Height := Bitmap.Height;
Jpeg.CompressionQuality := Quality;
Jpeg.Assign(Bitmap);
Finally
Bitmap.Free;
End;
Jpeg.SaveToStream(Stream);
Finally
Jpeg.Free;
End;
Finally
SetThreadDesktop(OldDesk);
CloseDesktop(Desk);
End;
End;
[add]
Ach ja, ich versuche nicht irgendeinen Desktop zu lesen.
Mein Programm hat Einen mit CreateDesktop erstellt und genau diesen möchte ich nun auch gern "sehen" können
Delphi-Quellcode:
Desktop := CreateDesktop(PChar('Run' + IntToStr(GetCurrentProcessId)),
nil, nil, 0, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE
or DESKTOP_HOOKCONTROL or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS
or DESKTOP_SWITCHDESKTOP or GENERIC_WRITE, nil);