Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.049 Beiträge
 
Delphi 12 Athens
 
#33

Re: ScreenShot von nichtsehbaren Desktop

  Alt 8. Nov 2009, 21:12
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);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat