Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Screenshot und semi transparente fenster (https://www.delphipraxis.net/112388-screenshot-und-semi-transparente-fenster.html)

Pichel 20. Apr 2008 01:45


Screenshot und semi transparente fenster
 
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.

toms 20. Apr 2008 07:01

Re: Screenshot und semi transparente fenster
 
Hallo

Bei BitBlt muss man gemäss msdn noch den "raster operation code" CAPTUREBLT angeben.

Delphi-Quellcode:
const
  CAPTUREBLT = $40000000;
Zitat:

Windows 98/Me, Windows 2000/XP: Includes any windows that are layered on top of your window in the resulting image. By default, the image only contains your window. Note that this generally cannot be used for printing device contexts.

Delphi-Quellcode:
BitBlt(bmp.Canvas.Handle, 0, 0, Width, Height, Dc, x, y, SRCCOPY or CAPTUREBLT);

Pichel 20. Apr 2008 09:52

Re: Screenshot und semi transparente fenster
 
Zitat:

Zitat von toms
Bei BitBlt muss man gemäss msdn noch den "raster operation code" CAPTUREBLT angeben.

Funktioniert SUPER Danke.

Aber mal wieder typisch, da probiert man stundenlang und sucht sich tot aber auf MSDN kommt man wieder nicht ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz