AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Screenshot like Snipping Tool

Ein Thema von Youuuu · begonnen am 14. Okt 2022 · letzter Beitrag vom 18. Okt 2022
 
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#31

AW: Screenshot like Snipping Tool

  Alt 16. Okt 2022, 01:44
Das ist doch der Link aus meinem Post
Den habe ich glatt übersehen.

Da ist doch ein Beispiel dabei, in dem das ganze komplett gekapselt verwendet wird.
Ja ich verstehe da nicht wie ich damit umgehen muss, dauert ein wenig bis ich mich da eingearbeitet habe.
Zurzeit habe ich noch DirectX9 eingebaut.
(Mir fällt leider kein Beispiel ein um es vernünftig auszuprobieren da bei mir auch die GDI Variante alles vom Desktop abfotographiert hat, auch Filme in einem Player)
Delphi-Quellcode:
procedure TkzScreenShot.ScreenShotDirectX9(const ALeft, ATop, ARight, ABottom: Integer);
var
  BitsPerPixel: Byte;
  pD3D: IDirect3D9;
  pSurface: IDirect3DSurface9;
  g_pD3DDevice: IDirect3DDevice9;
  D3DPP: TD3DPresentParameters;
  ARect: TRect;
  LockedRect: TD3DLockedRect;
  BMP: TBitmap;
  i, p: Integer;
begin
// MessageBox(0, 'DirectX9', 'DirectX9', MB_OK);
  FRect.Left := ALeft;
  FRect.Top := ATop;
  FRect.Right := ARight;
  FRect.Bottom := ABottom;
  FImageWidth := FRect.Right - FRect.Left;
  FImageHeight := FRect.Bottom - FRect.Top;
  BitsPerPixel := GetDeviceCaps(Application.MainForm.Canvas.Handle, BITSPIXEL);
  FillChar(d3dpp, SizeOf(d3dpp), 0);
  D3DPP.Windowed := True;
  D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
  D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;
  D3DPP.BackBufferWidth := Screen.Width;
  D3DPP.BackBufferHeight := Screen.Height;
  D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;
  pD3D := Direct3DCreate9(D3D_SDK_VERSION);
  pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_pD3DDevice);
  g_pD3DDevice.CreateOffscreenPlainSurface(Screen.Width, Screen.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, pSurface, nil);
  g_pD3DDevice.GetFrontBufferData(0, pSurface);
  ARect := FRect;
  pSurface.LockRect(LockedRect, @ARect, D3DLOCK_NO_DIRTY_UPDATE or D3DLOCK_NOSYSLOCK or D3DLOCK_READONLY);
  BMP := TBitmap.Create;
  try
    BMP.Width := FImageWidth;
    BMP.Height := FImageHeight;
    case BitsPerPixel of
      8: BMP.PixelFormat := pf8bit;
      16: BMP.PixelFormat := pf16bit;
      24: BMP.PixelFormat := pf24bit;
      32: BMP.PixelFormat := pf32bit;
      else
        BMP.PixelFormat := TPixelFormat.pfDevice;
    end;
    p := Cardinal(LockedRect.pBits);
    for i := 0 to FImageHeight - 1 do
      begin
        CopyMemory(BMP.ScanLine[i], Ptr(p), FImageWidth * BitsPerPixel div 8);
        p := p + LockedRect.Pitch;
      end;
    FImageWork := TBitmap.Create;
    try
      FImageWork.PixelFormat := BMP.PixelFormat;
      FImageWork.Width := BMP.Width;
      FImageWork.Height := BMP.Height;
      FCanvas.Handle := BMP.Canvas.Handle;
      if FInverted then
        begin
          FInverted := False;
          FImageWork.Canvas.CopyMode := cmSrcInvert;
        end
        else
          FImageWork.Canvas.CopyMode := cmSrcCopy;
      FImageWork.Canvas.CopyRect(
          Rect(0, 0, FImageWidth, FImageHeight),
          FCanvas,
          Rect(0, 0, FImageWidth - 1, FImageHeight - 1));
      FImage.ReleaseHandle;
      FImage.Assign(FImageWork);
    finally
      FImage.Dormant;
      FImage.FreeImage;
      FImageWork.Free;
    end;
  finally
    BMP.Free;
    pSurface.UnlockRect;
  end;
end;
// edit
Habe nachträglich mal eine Beispielanwendung zum ausprobieren angehangen, sollte alles selbsterklärend sein, so hoffe ich.
(Virus-Total meldet einen (falsch) fund:
Rising
Trojan.Generic@AI.89 (RDMK:cmRtazrbpxF5IptlRljLk8Ec4amq))
Angehängte Dateien
Dateityp: zip kzScreenShot.zip (851,9 KB, 7x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (16. Okt 2022 um 06:23 Uhr) Grund: fixed and updated
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz