Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Screenshot (https://www.delphipraxis.net/205298-screenshot.html)

Zodi 23. Aug 2020 15:15

Screenshot
 
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

djmsc 23. Aug 2020 17:44

AW: Screenshot
 
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.

himitsu 23. Aug 2020 17:50

AW: Screenshot
 
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.

djmsc 23. Aug 2020 18:01

AW: Screenshot
 
Bei nur einem Monitor (den ich auch nur habe) geht es.

Zodi 23. Aug 2020 18:17

AW: Screenshot
 
Danke für die Antworten.

Habe es jetzt mit einem Manifest gelöst.


Grüsse Zodi

himitsu 23. Aug 2020 18:21

AW: Screenshot
 
Zitat:

Zitat von djmsc (Beitrag 1472306)
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". :lol:

Medium 25. Aug 2020 01:30

AW: Screenshot
 
Zitat:

Zitat von djmsc (Beitrag 1472306)
Bei nur einem Monitor (den ich auch nur habe) geht es.

Und du bist das Maß der Dinge. Endlich ist diese Frage geklärt.

Sherlock 25. Aug 2020 08:27

AW: Screenshot
 
Zitat:

Zitat von Medium (Beitrag 1472354)
Zitat:

Zitat von djmsc (Beitrag 1472306)
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

TiGü 25. Aug 2020 08:54

AW: Screenshot
 
Zitat:

Zitat von Sherlock (Beitrag 1472356)
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

himitsu 25. Aug 2020 10:00

AW: Screenshot
 
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. :wink:

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. :angle:


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:09 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf