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 Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 13:42
Bitte bitte Du solltest deinen Code allerdings noch um ein Bitmap.Canvas.Lock vor dem PrintWindow und ein Bitmap.Canvas.Unlock danach erweitern. Ansonsten kann es vorkommen, dass seltsame Effekte auftreten wie z.B., dass das Zielfenster unkontrolliert anfängt zu flackern, während der Screenshot erstellt wird.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 14:33
Bitte bitte Du solltest deinen Code allerdings noch um ein Bitmap.Canvas.Lock vor dem PrintWindow und ein Bitmap.Canvas.Unlock danach erweitern. Ansonsten kann es vorkommen, dass seltsame Effekte auftreten wie z.B., dass das Zielfenster unkontrolliert anfängt zu flackern, während der Screenshot erstellt wird.
PrintWindow ist eine sehr schlechte Lösung um Screen Shots zu erstellen.

Warum?

Weil es nur mit einem Fenster richtig funktioniert in dem auch alle dafür benötigten Messagen korrekt verarbeitet werden.
Wenn dem nicht so ist lass es lieber.

Die Messagen die du behandeln musst sind WM_PRINT, WM_PRINTCLIENT nur damit kannst du korrekt auf den bereitgestellten wParam DC Zeichnen.
WM_PAINT sollte dann komplett ignoriert werden.

Verwende lieber etwa auf dieser Art.
Code:
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;
}
Zitat:
Du kannst es ja mit FullWindow = False mal probieren.
Sollte kein Problem sein.. warum auch ob ich nun den gesamten Screen kopiere oder nur den Teil der unter meiner Anwendung liegt spielt absolut keine rolle.
Es bleibt sich gleich.

gruss

Geändert von EWeiss (29. Mai 2018 um 14:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.690 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 15:19
Zum einen, ich Zeichne nichts ich knipps und Speicher. Es ist mittlerweile eine Tray-App ohne Fenster, nur Popupmenu.
Ok das ist etwas gelogen, es erscheint eine Prozess-Liste mit allem was ich knippsen könnte.

Was ich wollte macht es, ich wollte ein Window knippsen und mit FullWindow steuert man ob mit Fenster-Rahmen oder ohne, Du wirst da keinen Unterschied feststellen da Deine SkinEngine kein Windows-Rahmen besitzt.

Ich übersetze mal Dein Code nach Delphi und lasse mich Überraschen. Danke dafür!

Das Lock/Unlock habe ich einfach mal mit integriert, Danke Zacherl für den Hinweis!

Weil es nur mit einem Fenster richtig funktioniert in dem auch alle dafür benötigten Messagen korrekt verarbeitet werden.
Ich weiß nicht so genau wie Du das mit Messages meinst, könntest Du das bitte ein wenig Erläutern oder eine Quelle zum nachlesen angeben, Danke!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 15:28
Zitat:
Ich weiß nicht so genau wie Du das mit Messages meinst, könntest Du das bitte ein wenig Erläutern oder eine Quelle zum nachlesen angeben, Danke!
Was für eine Quelle?
Die Quelle ist meine Erfahrung..

Und was Windows Messagen sind muss dir doch klar sein.
Google mal nach WM_PRINT und WM_PRINTCLIENT zum Beispiel in Verbindung mit AnimateWindow

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 15:35
Google mal nach WM_PRINT und WM_PRINTCLIENT zum Beispiel in Verbindung mit AnimateWindow
Wenn MSDN-Library durchsuchenAnimateWindow verwendet wird, muss das Fenster MSDN-Library durchsuchenWM_PRINTCLIENT eigenständig implementieren. Ansonsten ist das alles kein Problem, da MSDN-Library durchsuchenWM_PRINT bei Standardeinstellungen von der MSDN-Library durchsuchenDefWindowProc abgearbeitet wird. Der Entwickler muss hierfür nicht wirklich etwas Eigenes implementieren.

Dennoch ist die Desktop Duplication API wie gesagt sowohl dieser Methode als auch dem Kopieren des DC Inhaltes jederzeit vorzuziehen. Wenn man noch kein Windows 8 verwendet, steht diese halt leider noch nicht zur Verfügung.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 15:46
Da schau an, nun weiß ich was Dir dabei im Kopf rumgeflattert ist, das gibt mir Anlass das ganze nochmal zu Überdenken, bei Deiner Roten Schrift Post dachte ich so etwas in der Richtung:
Wenn eine Applikation kein WM_PRINT o.ä. anbietet dann wird nichts aus Foto. Da meine Eigenen Programm diese Msg bis jetzt noch nie verwendet haben, testete ich es und knippsen ging. Der Nebel ist auf jedenfall gelichtet, many thanks!

Was mir jetzt wiederum durch den Kopf spukt, bei meinem ersten Post, da kopiere ich ja das DC und erhalte Bilder wo halt Sachen fehlen, nicht generell aber mal hier mal da. Wenn das kompilat mit Deiner Methode nicht zu groß ist, könntest Du es bitte zu Testzwecken bereitstellen, da seh ich ja gleich was mich erwartet und das wichtigste, ob es den Inhalt tatsächlich so knippst wie ich ihn aufm Desktop sehe. Siehe erster Post das Bilder-Knipps-Problem.

Nun bin ich ehrlich gesagt mehr als verwirrt.....
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 16:02
Zitat:
Was mir jetzt wiederum durch den Kopf spukt, bei meinem ersten Post, da kopiere ich ja das DC und erhalte Bilder wo halt Sachen fehlen,
Du kopierst aber genau das sollst du nicht tun..
Es hat damit zu tun weil du WM_PAINT zum zeichnen verwendest und nicht das zur Verfügung gestellte DC in WParam..
Wenn du WM_PRINT verwendest must du kein extra DC erstellen denn es ist vorhanden.

Zitat:
Wenn AnimateWindow verwendet wird, muss das Fenster WM_PRINTCLIENT eigenständig implementieren.
genau das mag unter VCL seine Bestimmung haben aber nicht unter Win32 glaube es mir schließlich habe ich die AnimateWindow Funktion in
meine NONVCL Lib integriert und das ist kein Spielchen.

Aber gut sei's drum.
https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

gruss

Geändert von EWeiss (29. Mai 2018 um 16:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 16:29
Hast du ja Recht im Falle von WM_PRINTCLIENT . Die normale WM_PRINT braucht man aber explizit nicht selbst implementieren. PW_CLIENTONLY könnte demnach Probleme machen, die Variante mit Rahmen allerdings nicht.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  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 09:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz