AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

Ein Thema von flashcoder · begonnen am 27. Apr 2019 · letzter Beitrag vom 28. Apr 2019
Antwort Antwort
Seite 2 von 2     12   
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#11

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 01:12
hdcScreen := hdcScreenResized; den gleichen Fehler übernommen den ich schon gemeldet habe.
Das SetWindowLongA(...EX_STYLE...) Problem tritt bei mir nur in der IDE auf, sonst nicht.
In Windows 10 wirkt sich das auf das gesamte System aus.
Nur ein Neustart korrigiert das wieder.
Benutze Windows 10. Keine Probleme, nachdem ich die IDE geschlossen habe.

Ich weiß auch, dass man den ganzen Block wohl besser direkt mit einer TBitmap macht
Spielt keine rolle letztendlich greift TBitmap auch auf die Win32API zu bleibt sich also gleiche welche Methode\Art man dafür verwendet.
gruss
Das wäre aber viel einfacher. TBitmap.Draw staucht ja auch, wenn nötig und man braucht sowieso ein TBitmap.
Rudy Velthuis
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 01:21
Zitat:
Benutze Windows 10. Keine Probleme, nachdem ich die IDE geschlossen habe.
das macht die Anwendung wenn die Zeilen aktiviert werden.

1. Die IDE lässt sich nur noch über den Taskmanager beenden.
2. Das gesamte System wird mit fast 50% ausgelastet.
3. Ich kann keine Eingaben hier im Forum mehr machen als Beispiel auf deinen Beitrag antworten oder irgendetwas editieren.
4. Es wirkt sich also auf das gesamte System aus.
5. Ein Neustart des System ist nötig!

Und nun macht was ihr wollt.
Nebenbei es wird alles falsch aufgenommen. Es ist nicht verwendbar.
Zitat:
der Screenshots in Z-Reihenfolge aufnehmen kann.
Und wenn es um die ZOrder geht warum wird dann nicht nur das Window gezeichnet\Aufgenommen das die höchste ZOrder hat? Irgendwie sinnlos das ganze.

gruss

Geändert von EWeiss ( 9. Jul 2019 um 09:32 Uhr)
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 02:28
Zitat:
Benutze Windows 10. Keine Probleme, nachdem ich die IDE geschlossen habe.
das macht die Anwendung wenn die Zeilen aktiviert werden.

1. Die IDE lässt sich nur noch über den Taskmanager beenden.
2. Das gesamte System wird mit fast 50% ausgelastet.
3. Ich kann keine Eingaben hier im Forum mehr machen als Beispiel auf deinen Beitrag antworten oder irgendetwas editieren.
4. Es wirkt sich also auf das gesamte System aus.
5. Ein Neustart des System ist nötig!
Wie gesagt: nicht bei mir. Ich hatte die Zeilen zuerst aktiv, und die IDE spielte verrückt, aber sonst nichts. Wenn aus dem Explorer gestartet, passiert keins von dem, was du beschreibst. Ich musste auch für die IDE nicht den Taskmanager benutzen.
Zitat:
Nebenbei es wird alles falsch aufgenommen. Es ist nicht verwendbar.
Zitat:
der Screenshots in Z-Reihenfolge aufnehmen kann.
Und wenn es um die ZOrder geht warum wird dann nicht nur das Window gezeichnet\Aufgenommen das die höchste ZOrder hat? Irgendwie sinnlos das ganze.
Es wird nur ein Screenshot aufgezeichnet (nur ein Bitmap).
Ich habe keine Ahnung was OP nun wirklich vorhat. Jedes Fenster vollständig als Screenshot, auch wenn es verdeckt ist?

Was zeigt dein Screenshot? Sieht fast aus wie ein Mac mit Parallels oder ähnlichem. Oder etwas, was aussehen soll wie ein Mac.
Rudy Velthuis

Geändert von Rudy Velthuis (28. Apr 2019 um 02:32 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 02:35
Zitat:
Was zeigt dein Screenshot? Sieht fast aus wie ein Mac. Oder läuft da Parellels oder VMWare?
Alle Fenster die im ScreenShot also dem aufgenommen Bitmap Schwartz gezeichnet werden fehlen die Transparenz also WM_EX_LAYERED style.
Jedes Fenster das diesen Style verwendet wird schwarz gezeichnet kann man doch auf meinem ScreenShot definitiv sehr genau erkennen.

Das betrifft meinen KVideo Player64, Meine Anwendung OTTB die aussieht wie beim Mac. Das CMD Fenster das plötzlich den Windows 10 Style verliert und in Win7 Style aufgenommen wird.

Und nein mein System ist Windows 10 keine VM oder ähnliches.
Wie gesagt das Teil taugt leider nichts da es nicht das tut was es soll.
Links ist das aufgenommene Bild im ScreenShot dort kannst du sehen das mein Player der eigentlich den Composite Modus verwendet schwarz ist.
Vergleiche das doch einfach mit dem Player auf der rechten Seite.

PS:
Ich denke du hast kein Problem weil du keine Anwendung mit WS_EX_LAYERED style verwendest..

Zitat:
WS_EX_COMPOSITED works by forcing child windows to draw back to front and by double buffering them; however, the double buffering used by WS_EX_COMPOSITED for thechild windows conflicts with the double buffering used by WS_EX_LAYERED windows and DWM so it does not remove the flicker in those contexts.
Es ist ein Unfug jedem Window den WS_EX_COMPOSITED Style verpassen zu wollen das kann nur schief gehen.
Und bringt das System komplett durcheinander.

gruss

Geändert von EWeiss (28. Apr 2019 um 07:20 Uhr)
  Mit Zitat antworten Zitat
flashcoder

Registriert seit: 10. Nov 2013
83 Beiträge
 
#15

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 03:06
Rudy Velthuis,

Ihr Code funktionierte problemlos mit IDE oder System. Danke für die Lösung!

Geändert von flashcoder (28. Apr 2019 um 03:10 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 03:08
Rudy Velthuis,

dein Code hat gut funktioniert. Vielen Dank für die Lösung!
OK wenn dich die schwarzen aufgenommenen Fenster nicht stören dann gebe ich dir recht.

OK! Ich bin raus aus dem Thread.

gruss
  Mit Zitat antworten Zitat
flashcoder

Registriert seit: 10. Nov 2013
83 Beiträge
 
#17

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 03:14
Rudy Velthuis,

dein Code hat gut funktioniert. Vielen Dank für die Lösung!
OK wenn dich die schwarzen aufgenommenen Fenster nicht stören dann gebe ich dir recht.

OK! Ich bin raus aus dem Thread.

gruss

EWeiss,

hast du eine Lösung für dieses Problem?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 03:25
Zitat:
OK! Ich bin raus aus dem Thread.
Hätte ich schon aber den Quelltext meiner Bibliothek gebe ich nicht heraus. Sorry.
Siehe Shot so muss ein ScreenShot aussehen und alles wiedergeben was Original auf dem Desktop sichtbar ist.

Das kann ich dir geben wenn du damit klar kommst.

Delphi-Quellcode:
procedure ScreenCaptureToBackground;
var
  Width, Height: Integer;
  hDeskTop: HWND;
  hDCSrce: HDC;
  pBits: PByte;
  bm: BITMAP;
  p: Integer;
  GIDC: HDC;
begin

  Width := GetSystemMetrics(SM_CXSCREEN);
  Height := GetSystemMetrics(SM_CYSCREEN);

  GIDC := gSprCtrl.GI_CreateImageBackground(HSprCtrl, Width, Height);

  hDeskTop := GetDesktopWindow;
  hDCSrce := GetWindowDC(hDeskTop);

  BitBlt(GIDC, 0, 0, Width, Height, hDCSrce, 0, 0, SRCCOPY);

  FillChar(bm, sizeof(bm), 0);
  GetObject(GetCurrentObject(GIDC, OBJECT_BITMAP), sizeof(bm), @bm);

  pBits := bm.bmBits;
  for p := (bm.bmWidth * bm.bmHeight) - 1 downto 1 do
  begin
    pBits[3] := 255;
    pBits := pBits + 4;
  end;

  ReleaseDC(hDeskTop, hDCSrce);
end;
GI_CreateImageBackground erstellt ein 32Bit Bitmap über "CreateDIBSection"


bsp.
GI_CreateImageBackground(HSprCtrl, Width, Height);

Delphi-Quellcode:
function gCreateDIBSection(DC: HDC; Width, Height, BitCount: Integer): HBitmap;
var
  bi: TBitmapInfo;
  lpBitmapBits: Pointer;
begin

  // Fill in the BITMAPINFOHEADER
  bi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
  bi.bmiHeader.biWidth := Width;
  bi.bmiHeader.biHeight := Height;
  bi.bmiHeader.biPlanes := 1;
  bi.bmiHeader.biBitCount := Word(BitCount);
  bi.bmiHeader.biCompression := BI_RGB;
  bi.bmiHeader.biSizeImage := 0;
  bi.bmiHeader.biXPelsPerMeter := 0;
  bi.bmiHeader.biYPelsPerMeter := 0;
  bi.bmiHeader.biClrUsed := 0;
  bi.bmiHeader.biClrImportant := 0;

  Result := CreateDIBSection(DC, bi, DIB_RGB_COLORS, lpBitmapBits, 0, 0);
end;
macht folgendes..
Delphi-Quellcode:
DC := GetDC(HSprCtrl);
hDCSrc := CreateCompatibleDC(DC);

hDIB := gCreateDIBSection(hDCSrc, Width, Height, 32);
// Ich speicher das HBitmap in meine Propertys und hole sie im PaintEvent mit GI_GetProperty zurück.
// Dafür musst du eine andere Lösung finden..
GI_SetProperty(HSprCtrl, GI_Bitmap, LONG_PTR(hDIB));
SelectObject(hDCSrc, hDIB);
// Ich speicher den Source DC in meine Property und hole sie im PaintEvent mit GI_GetProperty zurück.
// Dafür musst du eine andere Lösung finden..
GI_SetProperty(HSprCtrl, GI_DC, LONG_PTR(hDCSrc));
ReleaseDC(HSprCtrl, DC);

Result := hDCSrc;
Das Ergebnis siehst du auf dem Shot!
PS:
Nebenbei die ZOrder scheint dich nicht wirklich zu interessieren warum dann der ganze Aufwand?
Ein einfaches ScreenShot Programm sollte dann ausreichend sein dafür gibt es hier genug Beispiele.. Hier im Forum suchenScreenShot

gruss

Geändert von EWeiss ( 9. Jul 2019 um 09:32 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 13:40 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