AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bildschirmfoto knipst nicht alles

Bildschirmfoto knipst nicht alles

Ein Thema von KodeZwerg · begonnen am 29. Mai 2018 · letzter Beitrag vom 4. Jun 2018
Antwort Antwort
Seite 5 von 7   « Erste     345 67   
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.251 Beiträge
 
Delphi 10.3 Rio
 
#41

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.251 Beiträge
 
Delphi 10.3 Rio
 
#42

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
 
#43

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.251 Beiträge
 
Delphi 10.3 Rio
 
#44

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
 
#45

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
 
#46

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

Registriert seit: 1. Feb 2018
3.251 Beiträge
 
Delphi 10.3 Rio
 
#47

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 13:40
Ich bin heute etwas im Stress, tausend Dank für Deine liebe Erläuterung, abends werde ich mich damit mehr beschäftigen.
Für mich ist es erst Tag 2 mit dem ganzen DC Relaese Delete Strecht Bit Blt und all diesen Sachen.
Ich verinnerliche das schon noch, aber bitte habe etwas Rücksicht, Tag 2... (!)
Es ist total cool von Dir das Du Dir die Zeit zum lesen und schreiben nimmst, das hilft mir echt viel voll!

Rein im Kopf habe ich nun auch eine neue Sache die ich versuchen werde umzusetzen, für Dich alten Hasen im Gfx Business ist das ein klacks aber für mich nicht so ganz

Hier meine neue heran gehens weise Theorie: (ohne befehle zu nennen da ich da eh falsch liege ^_^)
Window Handle ermitteln
Window Rectangle ermitteln
Window verschwinden lassen
Rectangle Schwarz ausmalen
Window zurück holen
Knipsen
Schwarzes Rectangle löschen
Fertig.

So das ich wirklich nur das Fenster im Schnappschuss habe was ich wollte, Beispiel Dein OTTB mal wieder, wenn Da irgendein anderes Fenster drunter ist, das will ich ja nicht geknippst haben, ich hoffe ich konnte es Laienhaft einigermassen Gut Ausdrücken.

Danke für Input, ich lese Dich später!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#48

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 13:45
Kein Problem mach in ruhe.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.251 Beiträge
 
Delphi 10.3 Rio
 
#49

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 14:51
Ich sitze nun im Bus und habe Deine Erläuterung gelesen und auch Verstanden (!!!)
Heute abend geh ich mit neuem Mut frisch ans Werk, das Release/Delete ist absolut plausibel ohne viel Fachchinesisch Erklärt von Dir, da weiß ich ja nun Bescheid worauf ich achten muss. Auch das Du die Vorgehensweise nochmal beschrieben hast was was macht und wofür und warum und und und, vielen Dank mein Freund!
Ich muss selbst nur noch mir Bewusst werden womit ich arbeiten sollte weil ich irgendwie da auch noch nicht so ganz gecheckt habe wieso einer Methode a) nimmt und anderer Methode b)
TBitmap <-> HBITMAP, das eines direkt eine Graphik ist und das andere ein Handle zu einer Graphik ist mir schon irgendwie klar.... ach da gibt es noch viele Fragezeichen die ich hoffentlich bald lichten kann, Stück für stück wie eine Lawine presche ich mich voran in neue Gefilde.
Oder warum benutzt einer nach knipsen ein image.invalidate und ein anderer image.refresh.. all solche Sachen da muss ich noch viel blättern damit ich die zusammenhänge Verstehe bzw was Überhaupt die Unterschiede sind, für mich ists irgendwie das selbe.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#50

AW: Bildschirmfoto knipst nicht alles

  Alt 31. Mai 2018, 16:04
Zitat:
TBitmap <-> HBITMAP
Ich denke das weist du selbst kannst es Moment nur nicht richtig zuordnen.
Delphi-Quellcode:
MyBitmap := TBitmap.Create;
MyBitmap.Canvas.Handle := HBITMAP;
Zitat:
da auch noch nicht so ganz gecheckt habe wieso einer Methode a) nimmt und anderer Methode b)
Solange du nur einen Monitor unterstützen willst wäre die zweite Methode angebracht.
Willst du Multimonitor unterstützen dann die erste.

gruss
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf