AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bildschirmfoto knipst nicht alles
Thema durchsuchen
Ansicht
Themen-Optionen

Bildschirmfoto knipst nicht alles

Ein Thema von KodeZwerg · begonnen am 29. Mai 2018 · letzter Beitrag vom 4. Jun 2018
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.157 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 09:57
emm


BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);

BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY or CAPTUREBLT);
mit

Delphi-Quellcode:
Const
   CAPTUREBLT = $40000000;
Grüsse Mavarik
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 10:13
emm


BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);

BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY or CAPTUREBLT);
mit

Delphi-Quellcode:
Const
   CAPTUREBLT = $40000000;
Grüsse Mavarik
Zitat:
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.
Kann da keinen besonderen Vorteil drin erkennen.
Habe ich noch nie verwendet.

https://stackoverflow.com/questions/...y-of-the-targe
Denke das kann man getrost weglassen.

gruss

Geändert von EWeiss (30. Mai 2018 um 10:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.157 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 10:32
Kann da keinen besonderen Vorteil drin erkennen.
Habe ich noch nie verwendet.
Denke das kann man getrost weglassen.
Bei einem "Foto" des eigenen Fensters ggf. ja, aber wenn man z.B. die Gadgets vom Vista-Bildschirm auch im Image haben möchte, geht es nicht ohne...

Keine Ahnung ob das auch für andere Inhalte gilt, hab ich noch nicht getestet.

Mavarik
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 10:35
Kann da keinen besonderen Vorteil drin erkennen.
Habe ich noch nie verwendet.
Denke das kann man getrost weglassen.
Bei einem "Foto" des eigenen Fensters ggf. ja, aber wenn man z.B. die Gadgets vom Vista-Bildschirm auch im Image haben möchte, geht es nicht ohne...

Keine Ahnung ob das auch für andere Inhalte gilt, hab ich noch nicht getestet.

Mavarik
Ja das habe ich gelesen wenn es um Sprite auf dem Window geht (Widget)
Aber bei mir werden die auch ohne diese Flag aufgenommen.. siehe Shot.

Nun gut versuchen kann er es ja mal.. Nachteile wird er dadurch nicht habe.
Danke!

gruss

Geändert von EWeiss (11. Jul 2019 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 11:43
BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY or CAPTUREBLT);
Das bewirkt leider keinen Unterschied, Layered knipsen = schwarzes Bild, Danke trotzdem Mavarik!
Ich habe gerade neu gestartet und wenn fertig gebe ich bescheid oder pump es in Mitglieder Projekte.
So in etwa wird die GUI aussehen Screenshot - 30_05.jpg
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 22:19
@Emil, nun hab ich mal Dein Text für Delphi angepasst, funktioniert für ganzes Display mit egal was für Content. Danke
Jetzt taste ich mich an Deine zweite Variante ran.
Delphi-Quellcode:
Function CaptureScreen(var hbmp: HBITMAP): Boolean;
var
  hDCScreen, hDCMem : HDC;
  cx, cy: Integer;
  hBmpOld: HBITMAP;
  dwRop: DWORD;
begin
  hDCScreen := CreateDC('DISPLAY', 0, 0, 0);
  cx := GetDeviceCaps(hDCScreen, HORZRES);
  cy := GetDeviceCaps(hDCScreen, VERTRES);
  hDCMem := CreateCompatibleDC(hDCScreen);
  hbmp := CreateCompatibleBitmap(hDCScreen, cx, cy);
  hBmpOld := SelectObject(hDCMem, hbmp);
  dwRop := SRCCOPY or CAPTUREBLT;
  Result := BitBlt(hDCMem, 0, 0, cx, cy, hDCScreen, 0, 0, dwRop);
  SelectObject(hDCMem, hBmpOld);
  DeleteDC(hDCMem);
  DeleteDC(hDCScreen);
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 07:41
Sieht doch gut aus..
Warum hast du aber kein ReleaseDC genommen?

gruss

Geändert von EWeiss (31. Mai 2018 um 09:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 08:29
Guten Morgen Emil!
Die einfachste Antwort und zugleich auch die erschreckenste: ich wusste es nicht besser.
So sieht das Beispiel aus was Du hier rein gestellt hast.
Delphi-Quellcode:
BOOL CaptureScreen(HBITMAP& hBitmap)
{
    HDC hDCScreen = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
    const int cx = ::GetDeviceCaps(hDCScreen, HORZRES);
    const int cy = ::GetDeviceCaps(hDCScreen, VERTRES);
    HDC hDCMem = ::CreateCompatibleDC(hDCScreen);
    hBitmap = ::CreateCompatibleBitmap(hDCScreen, cx, cy);
    HBITMAP hBmpOld = (HBITMAP)::SelectObject(hDCMem, hBitmap);

    // Note: CAPTUREBLT flag is required to capture layered windows
    DWORD dwRop = SRCCOPY | CAPTUREBLT;
    BOOL bRet = ::BitBlt(hDCMem, 0, 0, cx, cy, hDCScreen, 0, 0, dwRop);

    ::SelectObject(hDCMem, hBmpOld);
    ::DeleteDC(hDCMem);
    ::DeleteDC(hDCScreen);

    return bRet;
}
Um ehrlich zu sein war ich schon happy das ich es so umsetzen konnte, mit Deiner zweiten "So-Wirds-Gemacht" Variante komme ich noch nicht wirklich voran aber alles wird gut
Zitat:
1. GetDesktopWindow
2. GetDC\CreateDC
3. GetWindowRect
4. StretchBlt via BitBlt.
5. ReleaseDC
Gruß vom KodeZwerg

Geändert von KodeZwerg (31. Mai 2018 um 08:32 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 08:51
Zitat:
Die einfachste Antwort und zugleich auch die erschreckenste: ich wusste es nicht besser.
Schade

Denn dein Beispiel war richtig wollte nur prüfen ob du den Unterschied zwischen GetDC, CreateDC, CreateCompatibleDC kennst.
Und ob du weist warum DeleteDC und nicht ReleaseDC in dieser Funktion verwendet werden muss.

Bitte versuche dich da nochmal zu informieren.
Denn es nicht zu wissen kann besonders hier bei der Freigabe\nicht Freigabe von DC's zu extremen Speicherlecks führen.

OK.. Ich mache es dir etwas einfacher.
Ein DC das man sich einholt also über Get! muss man freigeben und das freigeben geschieht über ReleaseDC..
Ein DC das man selber erstellt muss man löschen das macht man mit DeleteDC.

löschen und freigeben sind zwei unterschiedliche Dinge und die darf man nicht verwechseln.
Wie gesagt andernfalls könnte es sein das wenn du 5 Bilder in den Speicher geladen hast deine Anwendung plötzlich 200MB Speicher verwendet
dieser wird dann nicht freigegeben und du produzierst am laufenden Band Speicherlecks in Massen.

gruss

Geändert von EWeiss (31. Mai 2018 um 09:21 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 09:03
Zitat:
mit Deiner zweiten "So-Wirds-Gemacht" Variante komme ich noch nicht wirklich voran
Es ist eigentlich ganz einfach.

GetDesktopWindow.. gibt dir das Handle des Desktop zurück.
Dieses Handle verwendest du nun um über GetDC das DC des Desktop zu bekommen.
Dann ermittelst du über GetWindowRect die Ausmaße des Desktop (alternativ mit GetSystemMetrics)
Wenn du mehrere Monitore verwendest dann bitte mit "GetDeviceCaps". Aber Achtung dann keines falls GetDC verwenden sondern "CreateDC"
Abhängig davon wie du das Bild anzeigen willst in einem Panel das kleiner ist als das Bild was du aufnimmst (ohne Scrollbar)
musst du die Blitter Methode wählen in diesen Fall also StretchBlt damit wird das Komplette Bild in das Panel passend eingefügt.
Wenn du ein Panel mit Scrollbar erstellst kannst du BitBlt verwenden da du dann das Bild Scrollen kannst.
Anschließend ReleaseDC um das DC welches du dir über GetDC geholt hast wieder freizugeben.

Aber auch hier wieder aufpassen wenn du das DC über CreateDC erstellst DeleteDC verwenden.

gruss

Geändert von EWeiss (31. Mai 2018 um 11:29 Uhr)
  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 01:08 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