AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Grafik ausschneiden aus Fenster mit Fokus/Vordergrund
Thema durchsuchen
Ansicht
Themen-Optionen

Grafik ausschneiden aus Fenster mit Fokus/Vordergrund

Ein Thema von DelphiFan2008 · begonnen am 15. Feb 2023 · letzter Beitrag vom 17. Feb 2023
Antwort Antwort
DelphiFan2008

Registriert seit: 4. Dez 2008
81 Beiträge
 
Delphi XE2 Starter
 
#1

Grafik ausschneiden aus Fenster mit Fokus/Vordergrund

  Alt 15. Feb 2023, 16:31
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
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund

  Alt 15. Feb 2023, 17:06
[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}
Peter Below
  Mit Zitat antworten Zitat
DelphiFan2008

Registriert seit: 4. Dez 2008
81 Beiträge
 
Delphi XE2 Starter
 
#3

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund

  Alt 17. Feb 2023, 09:59
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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund

  Alt 17. Feb 2023, 10:08
Du kannst Dich gerne von meiner Snapshot Klasse inspirieren lassen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Aliquis

Registriert seit: 26. Jun 2011
Ort: Grafschaft Bentheim
18 Beiträge
 
Delphi 12 Athens
 
#5

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund

  Alt 17. Feb 2023, 13:07
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.
Georg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.119 Beiträge
 
Delphi 12 Athens
 
#6

AW: Grafik ausschneiden aus Fenster mit Fokus/Vordergrund

  Alt 17. Feb 2023, 13:24
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 08:19 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