Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#59

AW: Bildschirmfoto knipst nicht alles

  Alt 1. Jun 2018, 00:24
Zwischenstand:

Ich habe nun wieder probiert es hinzubekommen, komplett von vorne bis zum Ende ohne bei Methode b) abzugucken aber mit den Infos von Post 1 angefangen, so das ich theoretisch weiß was ich da mache. Hier stoße ich wieder auf das Layered Problem aber der Rest macht alles Prima. Ist sozusagen ein BestOf ohne Layered support.
Das ist sozusagen Methode c).... da diese Methode nicht klappt fange ich nun an Methode b) umzusetzen, ich sagte ja, alleine bin ich noch nicht im Stande und ich habe mir wirklich Mühe gegeben MSDN da zu Verstehen und Richtig einzusetzen aber eure Infos zu Layered für Methode b) vorbehalten/reserviert.
OTTB = Geht damit nicht von daher muss ich an dieser Stelle aufgeben mit Methode c)
Delphi-Quellcode:
Function Knipse(const Win: HWND; var tbmp: TBitmap; const FullWindow: Boolean): Boolean;
const
  CAPTUREBLT = $40000000;
var
  hDCScreen: HDC;
  rec: TRect;
begin
  Result := False;
  if Win = 0 then Exit;
  try
    begin
      if FullWindow then
       begin
         hDCScreen := GetWindowDC(Win);
         Windows.GetWindowRect(Win, rec)
       end else
       begin
         hDCScreen := GetDC(Win);
         Windows.GetClientRect(Win, rec);
       end;
      tbmp.PixelFormat:=pf32bit;
      tbmp.Width := Rec.Right - Rec.Left;
      tbmp.Height := Rec.Bottom - Rec.Top;
      tbmp.Canvas.Lock;
      StretchBlt(tbmp.Canvas.Handle, 0, 0,
                 tbmp.Width, tbmp.Height,
                 hDCScreen, 0, 0,
                 tbmp.Width, tbmp.Height,
                 SRCCOPY or CAPTUREBLT);
      tbmp.Canvas.Unlock;
    end;
  finally
    ReleaseDC(0, hDCScreen);
    Result := True;
  end;
end;
Und nicht das ihr denkt ich lese nicht alles, ich arbeite alles halt nur langsamer ab da es Neuland ist,
hier ist meine Interpretation einer WM_PRINT -> ClipBoard -> HBITMAP Variante, irgendwie alles falsch da ich kein Bild erhalte. Also Versucht habe ich es. Das hier steht allerdings nicht zur Debatte, nur zur Illustration wie man es nicht machen sollte
Delphi-Quellcode:
function MyWM_PRINT(const Win: HWND): HBITMAP;
var
  rect: TRECT;
  hBmp: HBITMAP;
  hOld: HGDIOBJ;
  hDCMem, hDCScreen: HDC;
begin
  hDCMem := CreateCompatibleDC(0);
  GetWindowRect(Win, rect);
  hBmp := 0;
  hDCScreen := GetDC(Win);
  hBmp := CreateCompatibleBitmap(hDCScreen, rect.right - rect.left, rect.bottom - rect.top);
  ReleaseDC(Win, hDCScreen);
  hOld := SelectObject(hDCMem, hBmp);
  SendMessage(Win, WM_PRINT, WPARAM(hDCMem), PRF_CHILDREN or PRF_CLIENT or PRF_ERASEBKGND or PRF_NONCLIENT or PRF_OWNED);
  SelectObject(hDCMem, hOld);
  DeleteObject(hDCMem); // ich glaub das wär falsch oder?
  DeleteDC(hDCMem); // oder doch so? me stupid
  OpenClipboard(Win);
  EmptyClipboard();
  SetClipboardData(CF_BITMAP, hBmp);
  Result := hBmp;
  CloseClipboard();
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat