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?

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
EWeiss
(Gast)

n/a Beiträge
 
#1

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

  Alt 28. Apr 2019, 01: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 06:20 Uhr)
  Mit Zitat antworten Zitat
flashcoder

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

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

  Alt 28. Apr 2019, 02: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 02:10 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

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

  Alt 28. Apr 2019, 02: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
 
#4

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

  Alt 28. Apr 2019, 02: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
 
#5

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

  Alt 28. Apr 2019, 02: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 08:32 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:57 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