Einzelnen Beitrag anzeigen

Benutzerbild von Pichel
Pichel

Registriert seit: 25. Feb 2005
Ort: Kassel
65 Beiträge
 
Delphi 7 Professional
 
#1

Screenshot und semi transparente fenster

  Alt 20. Apr 2008, 01:45
Hallöchen.

Ich habe festgestellt, dass die normalen Screenshot-Routinen auf den Desktop immer die semi-transtparenten Fenster nicht mit anzeigen.

Hier mal die von mir bevorzugte Methode einen Screenshot zu erzeugen:
Delphi-Quellcode:
Procedure BMPScreenShot(var bmp:TBitMap; x, y, Width, Height: integer);
var dc : HDC;
    lpPal : PLOGPALETTE;
begin
  {get the screen dc}
  dc := GetDc(0);
  if (dc = 0) then begin
    exit;
  end;
  {test width and height}
  if ((Width = 0) or (Height = 0)) then begin
    Width := getdevicecaps (dc, horzres);
    Height := getdevicecaps (dc, vertres);
  end;
  if ((Width = 0) or (Height = 0)) then begin
    exit;
  end;
  bmp.Width := Width;
  bmp.Height := Height;
  {do we have a palette device?}
  if (GetDeviceCaps(dc, RASTERCAPS) and RC_PALETTE = RC_PALETTE) then begin
    {allocate memory for a logical palette}
    GetMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
    {zero it out to be neat}
    FillChar(lpPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
    {fill in the palette version}
    lpPal^.palVersion := $300;
    {grab the system palette entries}
    lpPal^.palNumEntries := GetSystemPaletteEntries(dc, 0, 256, lpPal^.palPalEntry);
    if (lpPal^.PalNumEntries <> 0) then begin
      {create the palette}
      bmp.Palette := CreatePalette(lpPal^);
    end;
    FreeMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
  end;
  {copy from the screen to the bitmap}
  BitBlt(bmp.Canvas.Handle, 0, 0, Width, Height, Dc, x, y, SRCCOPY);
  {release the screen dc}
  ReleaseDc(0, dc);
end;
Erstelle ich ein Formular mit auch nur geringer Transparenz (Alphablending := True) wird es auf dem Screenshot unsichtbar.

Ein mit ALT-PRINT erzeugter Screenshot zeigt diese Formulare jedoch an.

Da ich hierfür keine Lösung gefunden habe, war mein nächster Ansatz transparente Fenster explizit nochmal zu kopieren und in den bestehen Screenshot einzufügen, da ich festgestellt habe, wenn ich dies transparente Fenster direkt über sein Handle ansprechen bekomme ich auch einen Screenshot von diesem Fenster.

Per EnumWindows fehlt mir nun jedoch die möglichkeit ausschliesslich Fenster mit aktiver Transparenz zu beachten.

Vielleicht hat jemand eine Idee.
Grüße aus Kassel.

Konfuzius sprach: Etwas lernen und sich immer wieder darin üben - schafft das nicht auch Befriedigung?
  Mit Zitat antworten Zitat