AGB  ·  Datenschutz  ·  Impressum  







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

Screenshot

Ein Thema von Zodi · begonnen am 23. Aug 2020 · letzter Beitrag vom 26. Aug 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Zodi
Zodi

Registriert seit: 19. Jul 2017
Ort: Berlin
47 Beiträge
 
Delphi XE7 Ultimate
 
#1

Screenshot

  Alt 23. Aug 2020, 15:15
Hi Delphianer

Ich befasse mich gerade mit den Screenshots
Delphi-Quellcode:
procedure Screenshot(shot: string);
 var
  dibH : hBitmap;
  bits : pointer;
  info : TBITMAPINFO;
  width,height : integer;
  screenDC,dibDC : hDC;
  f : file of byte;
  FileHeader : TBITMAPFILEHEADER;
begin
    screenDC := getDC(getDeskTopWindow);
    dibDC := createCompatibleDC(screenDC);
    width := getDeviceCaps(screenDC,HORZRES);
    height := getDeviceCaps(screenDC,VERTRES);
    info.bmiHeader.biXPelsPerMeter := round(getDeviceCaps(screenDC,LOGPIXELSX)*39.37);
    info.bmiHeader.biYPelsPerMeter := round(getDeviceCaps(screenDC,LOGPIXELSY)*39.37);
    zeromemory(@info,sizeOf(info));
    with info.bmiHeader do
    begin
         biSize := sizeOf(TBITMAPINFOHEADER);
         biWidth := screen.width;
         biheight := screen.height;
         biplanes := 1;
         biBitCount := 24;
         biCompression := BI_RGB;
    end;
    dibH := createDIBSection(dibDC,info,DIB_RGB_COLORS,bits,0,0);
    selectObject(dibDC,dibH);
    bitblt(
           dibDC,
           0,0,width,height,
           screenDC,
           0,0,
           SRCCOPY);
    releaseDC(getDeskTopWindow,screenDC);
    assignFile(f,shot);
    reWrite(f);

    if width and 3 <> 0 then
       width := 4*((width div 4)+1);

    with fileHeader do
    begin
         bfType := ord('B')+(ord('M')shl 8);
         bfSize := sizeOf(TBITMAPFILEHEADER)+sizeOf(TBITMAPINFOHEADER)+width*height*3;
         bfOffBits := sizeOf(TBITMAPINFOHEADER);
    end;

    blockWrite(f,fileHeader,sizeOf(TBITMAPFILEHEADER));
    blockWrite(f,info.bmiHeader,sizeOf(TBITMAPINFOHEADER));
    blockWrite(f,bits^,width*height*3);
    closeFile(f);
    deleteObject(dibH);
    deleteDC(dibDC);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  shot:string;
begin
   shot:='shot.jpg';
   screenshot(shot);
end;
Dies funktioniert auch aber mir ist aufgefallen das es den Taskbar nicht mit shootet.
Weis wer warum?

Update:
Die Bildschirm Skallierung war auf 125% wenn ich sie auf 100% setze dann shottet es richtig und der Taskbar ist korrekt.
Gibt es dafür ne Lösung wie man herausfinden kann welche skallierung gesetzt ist und es dann irgendwie berechen kann mit der screen.width und screen.height?

Grüsse Zodi
Pascal

Geändert von Zodi (23. Aug 2020 um 15:26 Uhr)
  Mit Zitat antworten Zitat
djmsc

Registriert seit: 5. Feb 2005
11 Beiträge
 
#2

AW: Screenshot

  Alt 23. Aug 2020, 17:44
Wie wäre es denn hier mit

Delphi-Quellcode:
uses
  Graphics;

// Capture the entire screen
// Screenshot des gesamten Bildschirms
procedure ScreenShot(Bild: TBitMap);
var
  c: TCanvas;
  r: TRect;
begin
  c := TCanvas.Create;
  c.Handle := GetWindowDC(GetDesktopWindow);
  try
    r := Rect(0, 0, Screen.Width, Screen.Height);
    Bild.Width := Screen.Width;
    Bild.Height := Screen.Height;
    Bild.Canvas.CopyRect(r, c, r);
  finally
    ReleaseDC(0, c.Handle);
    c.Free;
  end;
end;
Damit wird der gesamte Desktop in einem Bitmap gespeichert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Screenshot

  Alt 23. Aug 2020, 17:50
Screen.DesktopRect ... als Quelle niemals 0..Width (das Selbe bei Height)

Zieh mal den rechten Monitor nach links, dann bleibt der MainMonitor (Index 0) fast immer auf Pixel 0, aber Monitor 2 hat eine negative Position (Left)
und somit beginnt auch der Desktop (alle Monitore zusammen) weiter links.
$2B or not $2B
  Mit Zitat antworten Zitat
djmsc

Registriert seit: 5. Feb 2005
11 Beiträge
 
#4

AW: Screenshot

  Alt 23. Aug 2020, 18:01
Bei nur einem Monitor (den ich auch nur habe) geht es.
  Mit Zitat antworten Zitat
Benutzerbild von Zodi
Zodi

Registriert seit: 19. Jul 2017
Ort: Berlin
47 Beiträge
 
Delphi XE7 Ultimate
 
#5

AW: Screenshot

  Alt 23. Aug 2020, 18:17
Danke für die Antworten.

Habe es jetzt mit einem Manifest gelöst.


Grüsse Zodi
Pascal
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Screenshot

  Alt 23. Aug 2020, 18:21
Bei nur einem Monitor (den ich auch nur habe) geht es.
Das Problem hatten schon mehrere Entwickler ....

Bei einem Monitor geht auch Form.Position = DesktopCenter,
bei zwei Monitoren liegt das Bild dann in der Mitte, halb auf beiden Monitoren.

-> ScreenCenter


Geil ist auch, wenn man bei Entwickeln das Fenster auf dem zweiten Monitor hatte (vor allem damals, als die DesignForm noch frei umher flog)
und dann auf PCs mit nur einem Monitor, einem kleineren Monitor oder keinem Monitor an dieser Stelle,
dann ist das Fenster "weg".
$2B or not $2B

Geändert von himitsu (23. Aug 2020 um 18:24 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Screenshot

  Alt 25. Aug 2020, 01:30
Bei nur einem Monitor (den ich auch nur habe) geht es.
Und du bist das Maß der Dinge. Endlich ist diese Frage geklärt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#8

AW: Screenshot

  Alt 25. Aug 2020, 08:27
Bei nur einem Monitor (den ich auch nur habe) geht es.
Und du bist das Maß der Dinge. Endlich ist diese Frage geklärt.
So lange er die Anwendung nur für sich entwickelt, ist das auch so. Eine der Maximen der Softwareentwicklung ist das KISS Prinzip, wozu auch gehört nicht alle Eventualitäten einzuplanen oder zu berücksichtigen, sondern nur das, was tatsächlich gebraucht wird.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Screenshot

  Alt 25. Aug 2020, 08:54
So lange er die Anwendung nur für sich entwickelt, ist das auch so. Eine der Maximen der Softwareentwicklung ist das KISS Prinzip, wozu auch gehört nicht alle Eventualitäten einzuplanen oder zu berücksichtigen, sondern nur das, was tatsächlich gebraucht wird.
Ich bin ganz bei dir, hätte hier jetzt aber eher YAGNI in den Raum geworfen, weil deine Erklärung auch viel eher dazu passt.

https://de.wikipedia.org/wiki/YAGNI
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Screenshot

  Alt 25. Aug 2020, 10:00
Passt alles nicht.
Hier muß ja nichts zusätzlich implementiert werden, sondern es braucht nur die eine Ausgangsposition genutzt werden, welche immer passt.
Es ist sogar einfacher übersichtlicher das fertige Rect zu verwenden, anstatt selbst Eines zu bauen.

Aber klar, wenn man es jetzt nicht braucht, dann könnte man auch "einfach" nur 0 verwenden (KISS) und dann später erstmal den Fehler zu suchen, wenn man das Programm doch weitergegeben oder sich einen zweiten Monitor gekauft hat.
$2B or not $2B

Geändert von himitsu (25. Aug 2020 um 10:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:41 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