Delphi-PRAXiS
Seite 7 von 7   « Erste     567   

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)

KodeZwerg 1. Jun 2018 01:25

AW: Bildschirmfoto knipst nicht alles
 
Zitat:

Zitat von EWeiss (Beitrag 1403586)
Lock, Unlock ist nicht von nöten. StretchBlt auf der Basis auch nicht.

Das ist eigentlich ne Doppelfunktion nur Aufruf hier entfernt deswegen Dir noch Unbekannt.
Hat 2 Modis, erstelle Preview (auf aktuelle Größe was meine App dem Image bietet und halt das ganze 1:1 wie man es hier sieht.
Nur damit ich das auch weiß, entsteht dadurch ein Nachteil bei 0 Änderungen der Größe, wenn ja dann mach ich "FinalBildModus" mit BitBlt. <- Das meine Frage aber nichts desto trotz mach ich BitBlt daraus fürs FinalBild da Vertrau ich dem Experten! Ok das Lock Unlock spare ich auch mir Danke!
Zitat:

Zitat von EWeiss (Beitrag 1403586)
Delphi-Quellcode:
DeleteObject(hBmp);

Ich hab da echt nen Denkfehler aber
Delphi-Quellcode:
DeleteObject(hOld);
muss es lauten dann sollte es theoretisch passen aber das lenkt mich zu sehr ab.
Zitat:

Zitat von EWeiss (Beitrag 1403586)
Du weist doch gar nicht ob StretchBlt erfolgreich war.

Aua, Du hast Da natürlich total Recht und das korrigiere ich bei mir für die Akten..... mist dabei hatte ich mir soviel Mühe gegeben aber so lerne ich ja aus meinen Fehlern, Danke!:oops:

Für die Akten, so isses nu :-)
Delphi-Quellcode:
Function Knipse(const Win: HWND; var tbmp: TBitmap; const FullWindow: Boolean; const NewX, NewY: Integer): Boolean;
//Aufruf:
// Parameter 1 = Window Handle
// Parameter 2 = Ein Bitmap
// Parameter 3 = Mit oder ohne Rahmen (Titelleiste, Caption, SystemKnöpfe, Rand ums Fenster)
// Parameter 4 + 5 = 0 für Final 1:1 Bild, X + Y Pixel Angaben für Preview
// Danke Emil für korrekturen
const
  CAPTUREBLT = $40000000;
var
  hDCScreen: HDC;
  rec: TRect;
begin
  Result := False;
  if Win = 0 then Exit;
  try
    begin
      if FullWindow then
       begin
         hDCScreen := GetWindowDC(Win);
         Windows.GetWindowRect(Win, rec)
       end else
       begin
         hDCScreen := GetDC(Win);
         Windows.GetClientRect(Win, rec);
       end;
      tbmp.PixelFormat:=pf32bit;
      tbmp.Width := Rec.Right - Rec.Left;
      tbmp.Height := Rec.Bottom - Rec.Top;
      if ((NewX<>0)and(NewY<>0)) then
        Result := StretchBlt(tbmp.Canvas.Handle, 0, 0,
                   NewX, NewY,
                   hDCScreen, 0, 0,
                   tbmp.Width, tbmp.Height,
                   SRCCOPY or CAPTUREBLT)
      else
        Result := BitBlt(tbmp.Canvas.Handle, 0, 0,
                         tbmp.Width, tbmp.Height,
                         hDCScreen, 0, 0,
                         SRCCOPY or CAPTUREBLT);
    end;
  finally
    ReleaseDC(0, hDCScreen);
  end;
end;

EWeiss 1. Jun 2018 09:10

AW: Bildschirmfoto knipst nicht alles
 
Zitat:

Das ist eigentlich ne Doppelfunktion nur Aufruf hier entfernt deswegen Dir noch Unbekannt.
Was Lock, Unlock ?

Was soll mir da unbekannt sein?
Ist das selbe wie LockWindowUpdate.. und WM_SETREDRAW.
Und beide sind nicht nötig warum soll ich das Window vor neu zeichnen schützen?
Sehr suspekt das ganze.

Zitat:

X + Y Pixel Angaben für Preview
NewX, NewY hat nichts mit Pixeln zu tun bzw.. ist gleichzusetzen mit x, y wenn schon dann w, h die Parameter repräsentieren die Weite und die Höhe
des Container in dem das Bild gestreckt werden soll.

Ok denke es wurde alles gesagt.
Der Fertigstellung deines Projekts steht nun nichts mehr im Wege. ;)

EDIT:
Warum einmal
Delphi-Quellcode:
hDCScreen := GetWindowDC(Win);

und dann
Delphi-Quellcode:
hDCScreen := GetDC(Win);


Wenn schon dann umgekehrt.

Bei FullScreen GetDC und beim Kopieren von Fenster Inhalten incl. Rahmen und was so dazugehört GetWindowDC.
Der Unterschied ist einfach erklärt.

GetDC gibt dir das DC (device context) eines Client Bereichs zurück bzw. das des gesamten Bildschirms.
GetWindowDC gibt dir das DC (device context) eines Fensters einschließlich der Titelleiste, und Bildlaufleisten zurück.

Noch was du holst dir das DC von "Win" welches das auch immer ist und gibst es frei mit einem "0" Handle?
Delphi-Quellcode:
ReleaseDC(0, hDCScreen);

Wie das?

Ich könnte das verstehe wenn du das verwendest.
GetDC(0) und anschließend ReleaseDC(0, hDCScreen);

Aber nicht wenn du GetDC(Win) verwendest und anschließend ReleaseDC(0, hDCScreen)
Was gibst du hier frei? Gar nichts. Jetzt ReleaseDC(Win, hDCScreen) schon..

gruss

KodeZwerg 1. Jun 2018 13:20

AW: Bildschirmfoto knipst nicht alles
 
Danke nochmals für Deine Tipps!
War alles murks und hab ein neues Konzept für meine Methode.

KodeZwerg 3. Jun 2018 01:42

AW: Bildschirmfoto knipst nicht alles
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein kurzer Zwischenstand in Form eines Bildes, was man da sieht ist ein nicht Rechteckiges Layered Window vom Programm OTTB, mit Schwarz als Hintergrund. (Bei 1:1 wäre es der Dektop-Hintergrund bzw andere Fenster)
Anhang 49204
Es hapert noch an vielen Ecken und Kanten aber wie man sehen kann, ich bin auf dem besten Wege, Eure Hilfe und Geduld (besonders Emil) war Super nett und Lehrreich für mich bei diesem Abenteuer, Danke dafür!

Ps: Von Stretch bin ich komplett weg, das Preview ist nun auch das was gespeichert werden könnte.

Zitat:

Zitat von KodeZwerg (Beitrag 1403632)
War alles murks und hab ein neues Konzept für meine Methode.

Also was ich gebastelt hatte war murks, nicht was Du/Ihr geschrieben habt.

Daniel 3. Jun 2018 07:09

AW: Bildschirmfoto knipst nicht alles
 
Zitat:

Zitat von KodeZwerg (Beitrag 1403632)
Danke nochmals für Deine Tipps!
War alles murks und hab ein neues Konzept für meine Methode.

So und wenn jetzt jemand ein ähnliches Problem hat, sich durch diese 7 Seiten kämpft und am Ende feststellt, es war "alles Murks" - ist das unbefriedigend. Wie hast Du es denn nun gelöst?

KodeZwerg 3. Jun 2018 09:30

AW: Bildschirmfoto knipst nicht alles
 
Zitat:

Zitat von Daniel (Beitrag 1403726)
So und wenn jetzt jemand ein ähnliches Problem hat, sich durch diese 7 Seiten kämpft und am Ende feststellt, es war "alles Murks" - ist das unbefriedigend. Wie hast Du es denn nun gelöst?

Eigentlich habe ich vorgehabt den Source sobald der Richtig läuft zu teilen oder wird jetzt dieser Thread geschlossen?
Für Ungeduldige hier eine Kurzanleitung wie man ein Fenster knipst mit egal was für Content ohne störenden Hintergrund/andere Fenster.
Grundzutaten: 2 Fenster (Forms, Window) - 1. Form = GUI, 2. Form = leere Borderless Form, Vorgehensweise:
Haupt-Knips-Fenster wegmachen = ShowWindow(Application.Handle, SW_HIDE);
GetWindowRect() um Bildschirm Koordinaten von Quelle zu erhalten
die leere Borderless Form mit den Koordinaten füttern, einfärben und Anzeigen (hier war die ganze Zeit mein murks Denkfehler, ich malte ein Rechteck, das war total falsch da der Desktop sobald ich Quelle auf Screen hole ein Invalidate o.ä. ausführt und mein Rechteck weg ist bzw auch Negative Auswirkungen hatte!)
mit "if IsIconic(Win) then ShowWindow(Win, SW_RESTORE) else SetForegroundWindow(Win);" das Quell-Fenster in Vordergrund pumpen (über mein Borderless Window sozusagen)
"DC := GetDc(GetDesktopWindow);" verwenden um Zugang zu allem zu erhalten.
Knipsen wie gehabt = BitBlt(tBmp.Canvas.Handle, 0, 0, Width, Height, Dc, Left, Top, SRCCOPY or CAPTUREBLT);
Aufräumen: ReleaseDc(Win, dc); frmClear.Hide; SetForegroundWindow(Application.Handle);

Das war die Kurzfassung die dennoch alles an Informationen enthält um es selber so hinzubekommen wie es das Bild zeigt.

Wer Fragen hat die beantworte ich gerne. Wer will kann auch mein jetzigen Source bekommen, aber da sind noch viele viele Fehler enthalten, ich muss das Knipsen nochmal ändern, mein Fokus lag darauf das ich OTTB perfekt knipsen kann, das Ziel ist gelungen aber andere Fenster zicken noch rum.

EWeiss 3. Jun 2018 09:41

AW: Bildschirmfoto knipst nicht alles
 
Sorry du verstehst es einfach nicht. ;)
Wieder ein Speicherleck wo wir nun so oft drüber gesprochen haben.

Delphi-Quellcode:
ReleaseDc(Win, dc);

Delphi-Quellcode:
DC := GetDc(GetDesktopWindow);


Ohne den gesamten source zu sehen..

Was hat Win mit GetDesktopWindow zu tun?
Beides ist ein Handle aber du gibst wie bisher das falsche DC frei

Bitte so.. berichtigen.
Erstelle eine Variable hDesktopHandle oder anders benannt.

Delphi-Quellcode:
hDesktopHandle := GetDesktopWindow;
DC := GetDc(hDesktopHandle);
Nun gebe das korrekte DC frei von dem FensterHandle von dem du den Device Context geholt hast.
Delphi-Quellcode:
ReleaseDC(hDesktopHandle, DC);


Das Handle "Win" hat damit absolut nichts zu tun.
Nochmal in aller Deutlichkeit!
Du must das DC freigeben von dem Handle wo du es hergeholt hast nicht irgendeins das dir beliebt.

gruss

KodeZwerg 3. Jun 2018 09:52

AW: Bildschirmfoto knipst nicht alles
 
Nun hat es "klick" gemacht !!!:oops: Ich habs vorher falsch interpretiert bei Umsetzung, DAnke!:thumb::thumb::thumb: Ja, viele viele Fehler sind noch da .....

EWeiss 4. Jun 2018 23:07

AW: Bildschirmfoto knipst nicht alles
 
Nur nochmal zur Berichtigung Fehler im Eifer des Gefechts.
Wir wollen nicht das Handle dem DC zuweisen das ist voll murks ;) (deine Worte) :)
Delphi-Quellcode:
MyBitmap := TBitmap.Create;
MyBitmap.Canvas.Handle := HBITMAP;
So ist es richtig.
Delphi-Quellcode:
MyBitmap := TBitmap.Create;
MyBitmap.Handle := HBITMAP;
gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.
Seite 7 von 7   « Erste     567   

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