Delphi-PRAXiS
Seite 3 von 7     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bildschirmfoto knipst nicht alles (https://www.delphipraxis.net/196531-bildschirmfoto-knipst-nicht-alles.html)

EWeiss 29. Mai 2018 17:25

AW: Bildschirmfoto knipst nicht alles
 
Zitat:

Zitat von KodeZwerg (Beitrag 1403376)
Kurze Rückmeldung dann könnt ihr ja weiter machen, ich les euch gerne weil ich dabei gut lerne.

Zwischenbilanz mit PrintWindow:
Viele non-VCLs von Luckie kompiliert und geknippst = null problemo
Viele VCLs, auch non-Delphi, knippsen = null probleme
Hardwarebeschleunigter MediaPlayerClassic während Wiedergabe geknippst = null problemo
DirectX/OpenGL = Je nach Anwendung, das DX/GL ClientRect bleibt leer (nicht schwarz sondern so als ob man ne leere große Form hat.) Zumindest wird der Rahmen korrekt geknippst falls einer da ist und ichs aktiviert hab (FullWindow = True)

Was mich nun interessieren würde wäre ein Example wo es Probleme bereitet. Da ihr zwei Euch so gut in der Materie auskennt da habt ihr doch bestimmt ein kleines Dingens rumliegen was ich nicht knippsen könnte, oder?

Versuch einfach mal ein LayeredWindow zu knipsen. ;)
https://social.msdn.microsoft.com/Fo...forum=winforms

gruss

Zacherl 29. Mai 2018 18:06

AW: Bildschirmfoto knipst nicht alles
 
Zitat:

Zitat von KodeZwerg (Beitrag 1403376)
Was mich nun interessieren würde wäre ein Example wo es Probleme bereitet. Da ihr zwei Euch so gut in der Materie auskennt da habt ihr doch bestimmt ein kleines Dingens rumliegen was ich nicht knippsen könnte, oder?

Das würde mich ebenfalls interessieren, aber wir reden irgendwie ein wenig aneinander vorbei :-D
Delphi-Quellcode:
PrintWindow
mit
Delphi-Quellcode:
WM_PRINT
funktioniert meines Verständnisses nach halt immer (auch bei NonVCL), solange man am Ende in seiner WndProc die
Delphi-Quellcode:
DefWindowProc
aufruft (was man immer machen sollte). Aber gut, ich bin da sicherlich nicht so weit drinnen in der Materie wie Emil. Wobei KodeZwergs Tests ja eigentlich für sich sprechen.

Was Probleme geben könnte ist wie gesagt alles, was
Delphi-Quellcode:
WM_PRINTCLIENT
verwendet (was wiederrum laut Doku ja nur der Fall ist, wenn man bei
Delphi-Quellcode:
PrintWindow
das
Delphi-Quellcode:
PW_CLIENTONLY
setzt).

Das LayeredWindow würde mich tatsächlich aber auch mal interessieren. Zumindest auf einem halbwegs aktuellen Windows. Einige dieser Limitierungen sind seit spätestens 8.1 nämlich komplett obsolet.

KodeZwerg 29. Mai 2018 18:21

AW: Bildschirmfoto knipst nicht alles
 
Rückmeldung, habe nun ein non-Vcl (das berühmte 2 Fenster Demo von Luckie) so abgeändert:
Delphi-Quellcode:
  {Fenste 1 erzeugen und hWnd1 zuweisen}
  hWndMain := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
    WS_EX_LAYERED,
    LPARAM(CW_USEDEFAULT), LPARAM(CW_USEDEFAULT), Window1Width, Window1Height, 0, 0, hInstance,
    nil);
Ich kann es ohne Probleme knipsen, aber wie Zacherl bestimmt Richtig vermutet bin ich irgendwo anders nur nicht bei dem worüber Ihr redet.

EWeiss 29. Mai 2018 18:39

AW: Bildschirmfoto knipst nicht alles
 
Nur weil du das Fenster mit dem Style WS_EX_LAYERED erstellst ist es nicht transparent. ;)
Es fehlen die Attribute es fehlt die BLENDFUNCTION es fehlt UpdateLayeredWindow und, und, und :)
Ganz so einfach ist es dann doch nicht.
Such doch mal hier im Forum nach einem Projekt welches WS_EX_LAYERED korrekt verwendet.

http://www.nuonsoft.com/blog/2009/05...layeredwindow/

btw.. was sagt mein OTTB kannst du es rendern ? Knipsen?
Du solltest eigentlich ein schwarzes Window erhalten wenn du es aufnimmst.
OTTB ist ein Layered Window.

gruss

KodeZwerg 29. Mai 2018 19:25

AW: Bildschirmfoto knipst nicht alles
 
Ja danke nein, ich fange jetzt bestimmt nicht an mich in layered reinzulesen nur damit ich ein example erschaffen kann das ich nicht knipsen kann.

Zu OTTB, genau das war so ein example was ich meinte :thumb::thumb::thumb:
PrintWindow generiert ein schwarzes Bild, vollkommen Richtig! Danke Emil!
Nun hab ich ja eine "Anti-Knips" Applikation, sobald ich das gelöst habe meld ich wieder.... kann dauern -_-

Am Rande, meine profi Screenshot-Freeware-Software knipst das Perfekt ohne Desktop Hintergrund

ich schau mal ob ich heraus finde wie die das machen, ich leg jetzt auf:coder2:

edit
Das Freeware Tool gibts hier und lautet Screenshot Captor.

EWeiss 29. Mai 2018 19:48

AW: Bildschirmfoto knipst nicht alles
 
Zitat:

PrintWindow generiert ein schwarzes Bild, vollkommen Richtig! Danke Emil!
Und das sorry ich sage es nochmal wirst du nicht beheben können das ist die Unart von PrintWindow wenn WM_PRINT und WM_PRINTCLIENT nicht korrekt behandelt werden.
Alle Fenster die DirectX, LayeredWindow, Tollbars usw.. mit LayeredWindow verwenden werden dir an den stellen wo sie Transparent sind
ein schwarzes Feld zeigen da kannst du nichts machen.

Vergiss die API PrintWindow einfach ;) (Zumindest unter Win7) danach "Win7 up" können auch Child Windows Transparent gesetzt werden und das ganze könnte sich anders verhalten ;)
Ich mache lang genug mit Grafik da kannst du mir ruhig glauben es ist vertane Liebesmüh damit weiter rumzuspielen.

Zitat:

Das Freeware Tool gibts hier und lautet Screenshot Captor.
Ich installiere kein Apps ohne vernünftige Deinstallationsroutine (.exe)

Zu dem habe ich SnagIt gekauft das tut alles was ich will.
Trotzdem Danke.

gruss

KodeZwerg 29. Mai 2018 20:20

AW: Bildschirmfoto knipst nicht alles
 
Ja klar, ohne die Print Api, nun dank Example weiß ich was Du meintest und kann es Nachvollziehen, ich werds schon irgendwie hinbekommen, hab ja nun ein neues Forschungsprojekt "Knipps mit Delphi OTTB", ein paar Ansätze habe ich dazu schon aber die sind dann nicht so effektiv. (über OpenGL/DirectX Api Bildpuffer eventuell...)
Bei Erfolgen melde ich mich Zurück.

Ps: Das Tool hat einen UnInstaller und sollte mir nur als Beispiel dienen das es klappt.

KodeZwerg 29. Mai 2018 21:55

AW: Bildschirmfoto knipst nicht alles
 
Habs geschafft! Das einzige was nicht klappt ist das der Desktop Hintergrund nicht rausgefiltert wird, ansonsten klappts mit dem OTTB zu 100%, also Anti-Knips ist nicht mehr. Ich bin übers Canvas direkt rangegangen.

Ich teste nun wieder den Rest Test-Parcour durch, bei Erfolg oder Interesse Post ich mein noch nicht ganz fertigen Code.

edit
Erste Zwischenbilanz, es knippst OpenGL/DirectX (!), ich teste mal weiter aber ich glaube das kann ich mir sparen.

Luckie 29. Mai 2018 23:07

AW: Bildschirmfoto knipst nicht alles
 
Wie "Hintergrund herausfiltern"? Wenn du mit dem DC von dem betreffenden Fenster arbeitest, sollte auch nur das Fenster in das Bitmap kopiert werden.

KodeZwerg 29. Mai 2018 23:46

AW: Bildschirmfoto knipst nicht alles
 
Hallo Luckie,
Ich seh schon, Du hast mein Trick noch nicht durchschaut obwohl der Hinweis mit Hintergrund recht deutlich war. Um tatsächlich alles zu knipsen =
Delphi-Quellcode:
DC:=GetDC(0);
. Arbeite ich mit DC von Fenster hab ich Probleme, siehe erste Post.
Deswegen kann ich tatsächlich nun alles knipsen, mit dem Hintergrund Nachteil aber alles. Auch ein AnimateWindow kann nichts dagegen machen. Alle meine Tests wurden mehr oder minder gut bestanden.
Die minder guten Dinge sind noch bugs wo mir grad der Kopf dröhnt da ich komplett bei null mal wieder angefangen habe um mir dieses Anti-Knips-Egal Konzept zu entwickeln.

edit
Der erste Satz soll nicht hochnäsig oder angeberisch sein, Bitte Entschuldige mein Schreibstil

ps: über
Delphi-Quellcode:
CopyRect()
hol ich mir den Inhalt, die Positionen dafür ermittle auf ähnlich weise wie im ersten Post, diesmal habe ich aber alle Schritte getrennt.

Über die Unit Clipbrd glaube ich könnte man auch gehen um ans Ziel zu gelangen, da es jetzt im Grunde schon Einsatzbereit ist habe ich da noch nicht weiter nachgeforscht.

Ich überdenke mir gerade nochmal alles, ich glaube ich habe im Kopf schon die Lösung und muss Sie nur noch umsetzen.
Die Theorie:
Da ich jetzt weiß wie ich an Bild-Daten gelange, per
Delphi-Quellcode:
DC:=GetDC(0);
,
und den ganzen anderen Rest der dazu gehört bis das Image gespeichert ist (erste Post verrät fast alles),
Hier meine Idee,
Da wo ich knipsen will male ich kompletten Bereich Schwarz,
dann hole ich mir Ziel App wieder in den Vordergrund,
knipse und kille schwarzes Rechteck, so müsste es funktionieren denke ich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.
Seite 3 von 7     123 45     Letzte »    

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