Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Grafik ausschneiden aus Fenster mit Fokus/Vordergrund (https://www.delphipraxis.net/212478-grafik-ausschneiden-aus-fenster-mit-fokus-vordergrund.html)

DelphiFan2008 15. Feb 2023 16:31

Grafik ausschneiden aus Fenster mit Fokus/Vordergrund
 
Hallo,

ich möchte aus dem Fenster/Applikation die im Vordergrund läuft einen kleinen Teil des Fensters als Bitmap ausschneiden. Das "richtige" aktive Fenster (Fokus) bekomme ich über den Titel mit ...
Code:
function GetActiveWindowCaption: string;
var
  Handle : THandle;
  Len    : LongInt;
  Title  : String;
begin
  Result := '';
  Handle := GetForegroundWindow;
  if Handle <> 0 then
  begin
    Len := GetWindowTextLength( Handle ) + 1;
    SetLength( Title,Len );
    GetWindowText( Handle,PChar( Title ), Len );
    result := TrimRight( Title );
  end;
end;
Wie kann ich die Auflösung der Applikation des Fenster abfragen und dann die Grafik ausschneiden?

Danke und Gruß DelphiFan2008

peterbelow 15. Feb 2023 17:06

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund
 
[Win][Shift][S] (ruft das Windows Snippets Tool auf)

Naja, Scherz beiseite: Mit dem Handle des Fensters kannst Du per API GetWindowRect Position und Größe des Fensters ermitteln. Die klassische GDI-basierte Methode um an den Inhalt als Bitmap zu kommen ist, per GetDC(0) (oder GetDCEx) das display contect handle für den Bildschirm zu besorgen, eine TBitmap der gewünschten Größe anzulegen und per BitBlt den gewünschten Ausschnitt des Bildschirms in diese zu kopieren. Leider funktioniert das nicht mit allen Anwendungen zuverlässig.

Geht in etwa so:
Delphi-Quellcode:
var
  R: TRect;
  H: HDC;
begin
  ... Setz R auf die Koordinaten und Dimension des zu kopierenden Bereichs, in Screen Koordinaten
  H:= GetDC(0);
  try
    aBitmap.SetSize(R.Width, R.Height);
    BitBlt(aBitmap.Canvas.Handle, 0, 0, R.Width, R.Height,
      H, R.Left, R.Top, SRCCOPY);
  finally
    ReleaseDC(0, H);
  end; {finally}

DelphiFan2008 17. Feb 2023 09:59

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund
 
Hallo,

danke für die Antwort.

Das Ausschneiden funktioniert grundsätzlich. Ich verwende einen Monitor mit Auflösung 3840 x 2160 und Skalierung Text 150% (Einstellungen/Bildschirm/Skalierung und Anordnung)

Die Funktionen ... liefern für das Fenster im Vordergrund
Code:
GetWindowRect( Handle, WindowRect );

GetClientRect( Handle, WindowRect );
liefern 2560 x 1377 mit angezeigter Taskleiste, 1417 ohne Taskleiste - 1440 sollte die skalierte Bildschirmhöhe sein. Das Delta ist wohl der Fenstertitel.

Beim Ausschnitt mit Bitblt muss ich die reale Auflösung (3840 x 2160) als Basis angeben z.B. Ausschneiden am rechten Rand.

Wie kann ich den Skalierungsfaktor oder die physikatische Auflösung abfragen?
Code:
GetSystemMetrics(SM_CXSCREEN)

GetSystemMetrics(SM_CYSCREEN)
liefert ebenfalls 2560 x 1440, also nicht wirklich 3840 x 2160

Gruß DelphiFan2008

KodeZwerg 17. Feb 2023 10:08

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund
 
Du kannst Dich gerne von meiner Snapshot Klasse inspirieren lassen.

Aliquis 17. Feb 2023 13:07

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund
 
Zur Frage nach den falschen Abmessungen: so weit ich weiß, erhälst du die richtige Auflösung nur dann, wenn dein Programm "DPI-Aware" ist. Das kannst du in den Projekoptionen unter "Manifest" einstellen.

Es gibt eine Reihe von Funktionen des Objekts Screen, mit denen du den aktiven Monitor ermitteln kannst. Screen.MonitorFromRect, Screen.MonitorFromPoint usw. Monitor.PixelsPerInch*100/96 liefert dann die Skalierung.

himitsu 17. Feb 2023 13:24

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund
 
Kannst du das nicht einfach umrechnen?

Der Screenshot hat die originale Größe,
Screen sollte dir die virtuelle Größe geben.
Und schon kannst dir daraus den nötigen Multiplikator berechnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 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