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

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

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 01:19
Ja ok, mit DX/GL das seh ich total ein und lass es mehr als außen vor.
PintWindow kenne ich auch noch nicht, da schau ich mal nach.
Ich glaube nicht das der TC hardwarebeschleunigung an den fehlenden Stellen macht, das muss eine andere Ursache haben.
Zacherl Danke nochmal, bei Problemem melde ich mich wieder!
Gruß vom KodeZwerg
  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 <GELÖST>

  Alt 29. Mai 2018, 01:34
PrintWindow ist für mich DIE LÖSUNG!!! Vielen lieben Dank!
Habs bereits erfolgreich eingebaut und es knippst den TC ohne fehlenden Bildinhalt!

Frage: Funktioniert PrintWindow auch noch mit Windows 10?

Delphi-Quellcode:
function MyPrintWindow(const Win: HWND = 0; var Bmp: TBitmap; const FullWindow: Boolean = True): Boolean;
var
  rect: TRect;
begin
  Result := False;
  if Win = 0 then Exit;
  if FullWindow then
   GetWindowRect(Win, rect)
   else
   Windows.GetClientRect(Win, rect);
  bmp.Width := rect.Right - rect.Left;
  bmp.Height := rect.Bottom - rect.Top;
  Result := PrintWindow(Win, Bmp.Canvas.Handle, 0) ;
end;
Mini-Upgrade, so wirds bei Bedarf ohne Fenster-Rahmen geknippst.

Ps: Der erste Parameter sollte ein Prozess-Handle sein was ein Window besitzt.
Gruß vom KodeZwerg

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

n/a Beiträge
 
#3

AW: Bildschirmfoto knipst nicht alles

  Alt 29. Mai 2018, 05:52
Verdammt noch mal eigentlich bin ich ja zu blöd für so was.
Aber trotzdem bei mir knipst alles und ich kann es sogar noch etwas verschönern.

Sorry das musste sein!

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 29. Mai 2018, 07:55
Du kannst es ja mit FullWindow = False mal probieren.
Gruß vom KodeZwerg
  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, 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
 
#6

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.691 Beiträge
 
Delphi 11 Alexandria
 
#7

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
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:25 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