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
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Screenshot like Snipping Tool

  Alt 15. Okt 2022, 17:50
Zitat:
Gibt es was besseres, um Screenshots, remote, etc. zu blockieren?
Das ist z.B. ein guter Grund, warum irgendwann die alten API blockiert/entfernt werden, wenn sie derartige Sicherheitsmechianismen umgehen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Screenshot like Snipping Tool

  Alt 15. Okt 2022, 20:49
Wenn jemand bereit wäre diesen Quelltext nach DWM zu portieren wäre ich sehr dankbar.
Auch Verzeihung das ich vorhin etwas angepi.... war
Ich habe mir das mit DWM hier angeschaut und werde daraus nicht wirklich schlau.
Ich habe die in meiner zugrunde liegende "Schnappschuss" Methode nun isoliert so das hoffentlich klar sein sollte worum es mir geht, angestaubte Technik zu erneuern.
Wenn meine Vorgehensweise per left, top, right, bottom falsch ist im Umgang mit DWM dann bitte höflichst um Entschuldigung, da spricht dann meine Unwissenheit aus mir.
Delphi-Quellcode:
procedure TkzScreenShot.ScreenShot(const ALeft: Integer; const ATop: Integer; const ARight: Integer; const ABottom: Integer);
var
  ShotDC: HDC;
begin
  FRect.Left := ALeft;
  FRect.Top := ATop;
  FRect.Right := ARight;
  FRect.Bottom := ABottom;
  FImageWidth := FRect.Right - FRect.Left;
  FImageHeight := FRect.Bottom - FRect.Top;
  ShotDC := GetDCEx(GetDesktopWindow, 0, DCX_WINDOW or DCX_PARENTCLIP or DCX_CLIPSIBLINGS or DCX_CLIPCHILDREN);
  try
    FImage.ReleaseHandle;
    FImage.Width := FImageWidth;
    FImage.Height := FImageHeight;
    FCanvas.Handle := ShotDC;
    if FInverted then
      begin
        FInverted := False;
        FImage.Canvas.CopyMode := cmSrcInvert;
      end
      else
      FImage.Canvas.CopyMode := cmSrcCopy;
    FImage.Canvas.CopyRect(
          Rect(0, 0, FImageWidth, FImageHeight),
          FCanvas,
          Rect(FRect.Left,
               FRect.Top,
               FRect.Right,
               FRect.Bottom));
    FImage.Dormant;
    FImage.FreeImage;
  finally
    ReleaseDC(GetDesktopWindow, ShotDC);
  end;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#3

AW: Screenshot like Snipping Tool

  Alt 15. Okt 2022, 20:56
Das ist leider nicht ganz so simpel wie die Nutzung der GDI-Funktionen. Es gibt aber auch dafür fertige Quelltexte, die sehr einfach zu verwenden sind:
https://www.codeproject.com/Articles...-API-in-Delphi
Damit du und alle anderen euch nicht dort anmelden müsst, könnt ihr auch dieses Repository nutzen:
https://github.com/tothpaul/Delphi/t...DuplicationAPI
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Screenshot like Snipping Tool

  Alt 15. Okt 2022, 22:14
Das ist leider nicht ganz so simpel wie die Nutzung der GDI-Funktionen. Es gibt aber auch dafür fertige Quelltexte, die sehr einfach zu verwenden sind:
https://www.codeproject.com/Articles...-API-in-Delphi
Damit du und alle anderen euch nicht dort anmelden müsst, könnt ihr auch dieses Repository nutzen:
https://github.com/tothpaul/Delphi/t...DuplicationAPI
Das ist doch der Link aus meinem Post
Was ich an dieser Sache nicht verstehe, mir scheint es so als ob DWM ein Control Handle benötigt um darauf in Echtzeit zu Rendern/spiegeln.
Also Grundlegend arbeitet es anders als es bei GDI der Fall ist, auch mit einem DirectX-Bildformat hatte ich noch nichts am Hut aber in dem Beispiel-Quelltext aus meiner Post wird ja auch irgendwie ein TBitmap erwähnt.
Mal sehen ob ich damit was anfangen kann um im Endeffekt GetDC/ReleaseDC zu ersetzen
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#5

AW: Screenshot like Snipping Tool

  Alt 15. Okt 2022, 23:48
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

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
Benutzerbild von himitsu
himitsu

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

AW: Screenshot like Snipping Tool

  Alt 16. Okt 2022, 05:26
Eine Webcam mit KI und einer Kalaschnikow.

Wenn jemand Fotoapperat, Handy oder sonstwas rausholt, oder auch nur irgendwie angestengt gut, um sich die Details zu merken,
geht der Bildschirm aus und es klickt das kleine Pistölchen, damit derjenige mitbekommt, das er was Falsches machen wollte.


OK, gegen Alles kann eh nicht abgesichert werden.

Der der eine Wahrheitsliebende hatte es geschafft kistenweise Zeugs nach Hause zu schleppen, was unter den strengsten Sicherheitsbeingungen hätte nichtmal den Raum da verlasen dürfen, sonst wird man gleich ausversehn angerschossen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (16. Okt 2022 um 05:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Screenshot like Snipping Tool

  Alt 17. Okt 2022, 22:21
Das ist leider nicht ganz so simpel wie die Nutzung der GDI-Funktionen. Es gibt aber auch dafür fertige Quelltexte, die sehr einfach zu verwenden sind:
https://www.codeproject.com/Articles...-API-in-Delphi
Damit du und alle anderen euch nicht dort anmelden müsst, könnt ihr auch dieses Repository nutzen:
https://github.com/tothpaul/Delphi/t...DuplicationAPI
Nun habe ich mal das Github ausprobiert, es sind 2 total unterschiedliche Projekte gegenüber der Webseite.
Das von CodeProject, damit komme ich irgendwie so gar nicht klar.
Das vom Github war sehr einfach zu implementieren so das es erstmal überhaupt was macht

Der aktuelle Ist-Zustand:
Delphi-Quellcode:
procedure TkzSnapShot.ScreenShotDWM(const ALeft, ATop, ARight, ABottom: Integer);
var
  Index: Integer;
  BMP: TBitmap;
  lpPal: PLogPalette;
begin
// MessageBox(0, 'DWM', 'DWM', MB_OK);
  FSuccess := False;
  FRect.Left := ALeft;
  FRect.Top := ATop;
  FRect.Right := ARight;
  FRect.Bottom := ABottom;
  FImageWidth := FRect.Right - FRect.Left;
  FImageHeight := FRect.Bottom - FRect.Top;
  BMP := TBitmap.Create;
  try
    if FDuplication.GetFrame then
      begin
        FDuplication.DrawFrame(BMP);
        with BMP.Canvas do
          begin
            Pen.Color := clRed;
            Brush.Style := bsClear;
            for Index := 0 to FDuplication.DirtyCount - 1 do
              begin
                {$POINTERMATH ON}
                with FDuplication.DirtyRects[Index] do
                  Rectangle(Left, Top, Right, Bottom);
              end;
          end;

        FBMP := TBitmap.Create;
        try
          FBMP.PixelFormat := TPixelFormat.pf24bit;
          FBMP.Width := FImageWidth;
          FBMP.Height := FImageHeight;
          FCanvas.Handle := BMP.Canvas.Handle;
          if FInverted then
            begin
              FInverted := False;
              FBMP.Canvas.CopyMode := cmSrcInvert or CAPTUREBLT;
            end
            else
              FBMP.Canvas.CopyMode := cmSrcCopy or CAPTUREBLT;
              FBMP.Canvas.CopyRect(
                  Rect(0, 0, FImageWidth, FImageHeight),
                  FCanvas,
                  Rect(FRect.Left, FRect.Top, FRect.Right, FRect.Bottom));
          if (GetDeviceCaps(FCanvas.Handle, RASTERCAPS) and RC_PALETTE = RC_PALETTE) then
            begin
              GetMem(lpPal, SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY)));
              FillChar(lpPal^, SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY)), #0);
              lpPal^.palVersion := $300;
              lpPal^.palNumEntries := GetSystemPaletteEntries(FCanvas.Handle, 0, 256, lpPal^.palPalEntry);
              if (lpPal^.palNumEntries <> 0) then
                FBMP.Palette := CreatePalette(lpPal^);
              FreeMem(lpPal, SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY)));
            end;
          FBitmap.ReleaseHandle;
          FBitmap.Assign(FBMP);
        finally
          FBMP.Free;
          FBitmap.Dormant;
          FBitmap.FreeImage;
          FSuccess := True;
        end;
      end;
  finally
    BMP.Free;
  end;
  if (FSuccess and FAutoClipboard) then
    CopyToClipboard;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: Screenshot like Snipping Tool

  Alt 18. Okt 2022, 08:20
Wollte zwar nichts mehr dazu sagen.

Aber DDA (DesktopDuplicationAPI) hat nichts mit DWM (DestopWindowsManager) zu tun. Oder umgekehrt.
Wo greifst du in dem Schnipsel auf die DWM Schnittstelle zu? So das der Name der Funktion "ScreenShotDWM" gerechtfertigt wäre.

Geändert von venice2 (18. Okt 2022 um 08:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Screenshot like Snipping Tool

  Alt 18. Okt 2022, 14:23
Wollte zwar nichts mehr dazu sagen.

Aber DDA (DesktopDuplicationAPI) hat nichts mit DWM (DestopWindowsManager) zu tun. Oder umgekehrt.
Wo greifst du in dem Schnipsel auf die DWM Schnittstelle zu? So das der Name der Funktion "ScreenShotDWM" gerechtfertigt wäre.
Jop. Stimme Dir zu, name war falsch gewählt und bereits kurz nach dem post bereits abgeändert.
(mit irgend einen namen muss man es ja erst mal testen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:07 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