AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Screenshot und Skalierung

Ein Thema von tofse01 · begonnen am 20. Nov 2024 · letzter Beitrag vom 25. Nov 2024
Antwort Antwort
tofse01

Registriert seit: 20. Nov 2024
8 Beiträge
 
#1

Screenshot und Skalierung

  Alt 20. Nov 2024, 08:42
Hallo zusammen

ich habe hier eine Delphi XE Installation unter Win 10 und seit einigen Jahren nicht mehr wirklich damit gearbeitet.

Habe nun die Aufgabe bekommen, ein Programm zu schreiben, das einen Screenshot von einem andere Programm erzeugt und dazu Infos aus einer DB lädt, und beides zusammen an eine Schnittstelle schickt.
Habe ich in der Vergangenheit in anderen Konstellationen schon gemacht und dachte mir, wird kein Problem sein.

Im Prinzip habe ich auch schon alles, musste aber feststellen, dass gerade die Aktion mit dem Screenshot für mich ein größeres Problem darstellt.
Ich erstelle den SCreenhot, bekomme die Koordinaten von dem anderen Programm, nur leider passen die nicht zusammen. Speichere ich also an Hand der Koordination den Bildausschnitt vom Screenshot ab, stimmt das nicht überein, soll heißen, die Rändern sind verschoben und ich bekomme einen komplett anderen Bereich bzw. auch nur einen Teilausschnitt

Zuerst wusste ich nicht, woran das hängt, bis ich auf die Skalierung gekommen bin. Bei uns in der Firma ist diese auf 125% eingestellt. Ändere ich es mir auf 100%, passt es soweit.

Nur ich muss halt mit 125% klar kommen. Ich habe das Netz durchforstet und bin aber nicht klar gekommen. Problem ist halt auch, dass ich ca. 7-8 Jahre nichts mit Delphi zu tun hatte. Habe Infos gefunden, dass man in der IDE was einstellen kann in Bezug auf High DPI, aber das gibt es bei XE wohl nicht. Auch habe ich zu Manifest Dateien was gefunden, aber keine wirklich verständliche Vorgehensweise

Ich dachte, das mit dem Screenshot wäre simpel, ist es aber hier nicht
Hat jemand einen Tipp für mich?

Habe schon versucht, die Screenshot Koordinaten umzurechnen, aber das klappt nicht, kommt immer was anderes raus, bzw. die 25% Unterschied zeigen sich nicht in der Realität.
Habe z.B. mit Greenshot die "echten" Koordinaten ermittelt und mit den verglichen, die ich im Programm erhalte. Da besteht für mich kein Zusammenhang mit 100% zu 125%

Hilfe

Danke
Christof
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.678 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Screenshot und Skalierung

  Alt 20. Nov 2024, 08:48
Wie erstellst Du denn den Screenshot?

Nach dem, was Du schreibst, ist das ja der komplette Bildschirm (also was man mit Ctrl+Druck bekommt), Dann muss man natürlich den entsprechenden Ausschnitt bestimmen, wo dann die Skalierung Probleme bereitet.

Wenn ich mich recht erinnere, gibt es auch die Möglichkeit, nur einen Screenshot von einem bestimmten Fenster zu erzeugen (= Alt+Druck). Dann bräuchte man den Ausschnitt nicht mehr selbst ermitteln.
Thomas Mueller
  Mit Zitat antworten Zitat
tofse01

Registriert seit: 20. Nov 2024
8 Beiträge
 
#3

AW: Screenshot und Skalierung

  Alt 20. Nov 2024, 08:52
Hallo,

ich verstehe nicht, was du meinst.
Ich habe das Handle von dem Programm, das ich als Screenshot benötige


Habe diese Code, mit GetWindowRect bekomme ich die Koordinaten, aber die passen nicht
Delphi-Quellcode:
procedure ScreenShot(hWindow: HWND; bm: TBitmap; te:TEdit);
var
  Left, Top, Width, Height: Word;
  R: TRect;
  dc: HDC;
  lpPal: PLOGPALETTE;
begin
  {Check if valid window handle}
  if not IsWindow(hWindow) then Exit;
  {Retrieves the rectangular coordinates of the specified window}
  GetWindowRect(hWindow, R);

  te.Text:='L: '+inttostr(R.Left)+' T: '+inttostr(R.Top)+' B: '+inttostr(R.Bottom)+' R:'+inttostr(R.Right)+' ';

  //R.Right:=round(R.Right*1.25);

  Left := R.Left;
  Top := R.Top;
  Width := R.Right - R.Left;
  Height := R.Bottom - R.Top;
  bm.Width := Width;
  bm.Height := Height;
  {get the screen dc}
  dc := GetDc(0);
  if (dc = 0) then
  begin
    Exit;
  end;
  {do we have a palette device?}
  if (GetDeviceCaps(dc, RASTERCAPS) and
    RC_PALETTE = RC_PALETTE) then
  begin
    {allocate memory for a logical palette}
    GetMem(lpPal,
      SizeOf(TLOGPALETTE) +
    (255 * SizeOf(TPALETTEENTRY)));
    {zero it out to be neat}
    FillChar(lpPal^,
      SizeOf(TLOGPALETTE) +
    (255 * SizeOf(TPALETTEENTRY)),
      #0);
    {fill in the palette version}
    lpPal^.palVersion := $300;
    {grab the system palette entries}
    lpPal^.palNumEntries :=
      GetSystemPaletteEntries(dc,
      0,
      256,
      lpPal^.palPalEntry);
    if (lpPal^.PalNumEntries <> 0) then
    begin
      {create the palette}
      bm.Palette := CreatePalette(lpPal^);
    end;
    FreeMem(lpPal, SizeOf(TLOGPALETTE) +
    (255 * SizeOf(TPALETTEENTRY)));
  end;
  {copy from the screen to the bitmap}
  BitBlt(bm.Canvas.Handle,
    0,
    0,
    Width,
    Height,
    Dc,
    Left,
    Top,
    SRCCOPY);
  {release the screen dc}
  ReleaseDc(0, dc);
end;
  Mit Zitat antworten Zitat
tofse01

Registriert seit: 20. Nov 2024
8 Beiträge
 
#4

AW: Screenshot und Skalierung

  Alt 20. Nov 2024, 08:58
Ich demonstriere mal das Problem mit dem "Windows Rechner" als Beispielprogramm.

Die "echten" linken, oberen Koordinaten sind 252 x 193

Mein Programm bekommt mit dem obigen Code aber das hier raus, siehe Bild, alles ist versetzt und abgeschnitten
Angehängte Grafiken
Dateityp: png 2024-11-20 09_56_50.png (104,1 KB, 41x aufgerufen)
  Mit Zitat antworten Zitat
supermulti81

Registriert seit: 13. Okt 2023
31 Beiträge
 
#5

AW: Screenshot und Skalierung

  Alt 20. Nov 2024, 09:23
Moin,
probiere bzw. ersetze mal:
GetWindowRect(hWindow, R);

durch

GetClientRect(hWindow, R);
Width := R.Width;
Height := R.Height;
  Mit Zitat antworten Zitat
tofse01

Registriert seit: 20. Nov 2024
8 Beiträge
 
#6

AW: Screenshot und Skalierung

  Alt 20. Nov 2024, 09:25
Danke, ich brauche aber die Koordinaten von dem Programm, und die von dir genannte GetClientRect hat keine Parameter
  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 16:59 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