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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 23:07
Wie "Hintergrund herausfiltern"? Wenn du mit dem DC von dem betreffenden Fenster arbeitest, sollte auch nur das Fenster in das Bitmap kopiert werden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 23:46
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 = 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 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 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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (30. Mai 2018 um 00:42 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 05:37
Zitat:
Auch ein AnimateWindow kann nichts dagegen machen.
Ist mir jetzt schleierhaft was das aufnehmen eines Hintergrund in irgendeiner Form mit AnimateWindow zu tun hat.
Zitat:
ps: über CopyRect() hol ich mir den Inhalt
Es wäre vielleicht ratsam erst einen Rahmen um das entsprechende Objekt zu zeichnen und erst dann aufzunehmen.
So kannst du sehen wo du dich gerade befindest.
Siehe Pic.

Aber!

Wie Luckie schon sagt!
Überdenke nochmal dein Konzept.
DC:=GetDC(0); Was glaubst du wessen DC du da in Anspruch nimmst?
Und warum du den Desktop nicht ignorieren kannst bei der Aufnahme?
Zudem GetDC(0) für eine ScreenShot Anwendung ist eine schlechte Wahl.

Mitunter wäre es ein einfaches.. dir das Bitmap direkt vom DC zu holen ohne den ganzen Umweg über CopyRect, ClipBord, Hintergrund schwarz machen und die anderen Sache die du dir so ausdenkst.
Und wenn du Qualität haben möchtest kommst du nicht Drumherum vorher ein 32BItDC zu erstelle.
Es ich schön mit unter vorgefertigte Schnipsel zu verwenden und einfach... aber du lernst nichts dabei.
Du weist nicht warum mache ich dies oder das welche Auswirkung kann dies oder jenes haben.
Sorry du stellst hier fragen bekommst Antworten aber du Entwickelst dein Projekt nicht auf dieser Basis und du verstehst nicht wirklich was du da tust oder hast
du dir jede Definition, Funktion, Variable einmal angeschaut welche Auswirkung diese haben?
Wenn ja dann habe ich nichts gesagt.
Wenn nicht tja dann hast du nichts dabei gelernt.

Beim ganzen Thread habe ich eigentlich nicht verstanden um was es dir eigentlich geht.
Du willst den Desktop knipsen ok.. kein Problem das ist ein 4 Zeiler an Code.
Du willst den Clientbereich knipsen? Ist auch nicht mehr an aufwand.
Insgesamt verstehe ich deine Probleme nicht.

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

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 07:26
DC:=GetDC(0); Was glaubst du wessen DC du da in Anspruch nimmst?
Zitat:
If this value is NULL, GetDC retrieves the DC for the entire screen.
Dieses.
Es wäre vielleicht ratsam erst einen Rahmen um das entsprechende Objekt zu zeichnen und erst dann aufzunehmen.
Das probierte ich zu beschreiben dass das meine nächsten Schritte sind.
Wie Luckie schon sagt! Überdenke nochmal dein Konzept.
Kein Scherz, ich sehe bei mir keine Nachricht von Luckie, wo soll er sowas geschrieben haben?
Hab Verstanden was Du meinst aber da bin ich dann wieder beim Source von Post #1 was ja nicht klappt.
Falls selber noch nicht getestet, beim Post #1 ist die Umsetzung so:
Kompiliere und starte es, öffne das Fenster was Du knipsen willst, zurück zu mein Ding und auf knipsen klicken.
Ja sehr unzuverlässig aber nun habe ich eine Prozessliste, sehr zuverlässig.
Beim ganzen Thread habe ich eigentlich nicht verstanden um was es dir eigentlich geht.
Es geht mir nicht ums Kekse backen, ich will ein Fenster fotographieren so wie es mir auch der Desktop präsentiert.
Unabhängig ob das Fenster irgendwelche Tricks anwendet so das ein Knipsen erschwert wird.
Beispiele: Dein OTTB Layered oder was auch immer für DirectX/OpenGL Overlays, alles soll klappen.


Bin bald fertig.
Ps: Ja das Du das was ich in sehr vielen Zeilen mit nur einem Befehl hinbekommst weil Du weißt was Du tust ist mir klar, da mir die Erfahrung fehlt und ich keine Ahnung davon habe mache ich es nunmal so wie ich es mache.
Ich finde es für mich da es Neuland ist ein nettes Freizeitprojekt.

edit
Ps: Frage: Wenn Du selbst Dein OTTB mit deiner selbstgebackenen Knipsmethode knipst und da nen Rahmen malst, wo issn der Rahmen dann?
Gruß vom KodeZwerg

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

n/a Beiträge
 
#5

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 08:11
Zitat:
Dieses.
Nein.. Es gibt das DC des Virtuellen Bildschirm (Screen) zurück.
Und was machst du nun wenn du mehrere Monitore verwendest du glaubst das es dann immer noch funktioniert?
Wenn du also mit mehreren Monitoren arbeitern willst solltest du das verwenden.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Zitat:
Kein Scherz, ich sehe bei mir keine Nachricht von Luckie, wo soll er sowas geschrieben haben?
Er sagte nicht das du dein Konzept überdenken sollst.
Zitat:
Wie "Hintergrund herausfiltern"? Wenn du mit dem DC von dem betreffenden Fenster arbeitest, sollte auch nur das Fenster in das Bitmap kopiert werden.
Das sagte Ich. Denn ich verstehe deine Herangehensweise leider auch nicht.
Es reicht wenn man sich das Bitmap direkt vom DC holt
Da muss man nix rausfiltern.
HBitmap(GetCurrentObject(DC, OBJ_BITMAP));
Zitat:
Es geht mir nicht ums Kekse backen, ich will ein Fenster fotographieren so wie es mir auch der Desktop präsentiert.
Aha.. OK ein vier\fünf Zeiler also.
1. GetDesktopWindow
2. GetDC\CreateDC
3. GetWindowRect
4. StretchBlt via BitBlt.
5. ReleaseDC

Das knipst alles incl. die Videos in meinem Player(DirectX) und Layered Windows.
Zitat:
da mir die Erfahrung fehlt und ich keine Ahnung davon habe mache ich es nunmal so wie ich es mache.
Zitat:
Frage: Wenn Du selbst Dein OTTB mit deiner selbstgebackenen Knipsmethode knipst und da nen Rahmen malst, wo issn der Rahmen dann?
Wo er hingehört um OTTB.

Sorry! Ich wollte dir nicht zu nahe treten, mach wie du willst.
Bin erste mal raus. (Dachte du wolltest etwas dabei lernen)

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

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 08:26
Och menno, Ok, Danke auf jeden fall für die korrekte heran gehens weise, ich versuche es so wie Du es beschreibst umzusetzen.

edit
Ich habe gerade dein update mit Bild gesehen, da ist doch auch Desktop Hintergrund, das meinte ich mit rausfiltern bei obiger Aussage.
Gruß vom KodeZwerg

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

n/a Beiträge
 
#7

AW: Bildschirmfoto knipst nicht alles

  Alt 30. Mai 2018, 08:34
Och menno, Ok, Danke auf jeden fall für die korrekte heran gehens weise, ich versuche es so wie Du es beschreibst umzusetzen.

edit
Ich habe gerade dein update mit Bild gesehen, da ist doch auch Desktop Hintergrund, das meinte ich mit rausfiltern bei obiger Aussage.
OK dies Antwort noch.
Dann hole dir doch direkt das Bitmap vom DC was gibt es da raus zu filtern.
Habe dir doch gezeigt wie es geht.
HBitmap(GetCurrentObject(DC, OBJ_BITMAP));
Aber ehrlich? Frage mich was es dir bringen soll ob ich nun den Hintergrund des Desktop im Bereich von OTTB sehe
oder aber nachher anstelle dessen einen weißen\schwarzen oder was auch immer Hintergrund habe ist gehüpft wie gesprungen.

Das einzige was du dann noch machen könntest das Bild als PNG kopieren und den schwarzen\weißen Hintergrund dann ausschneidest.
Aber das ist wieder höhere Mathematik

gruss

Geändert von EWeiss (30. Mai 2018 um 08:37 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 16:51 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