Delphi-PRAXiS

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 14: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 16: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 16: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 17:01

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

Zodi 23. Aug 2020 17:17

AW: Screenshot
 
Danke für die Antworten.

Habe es jetzt mit einem Manifest gelöst.


Grüsse Zodi

himitsu 23. Aug 2020 17: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 00: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 07: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 07: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 09: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:

freimatz 25. Aug 2020 11:49

AW: Screenshot
 
Ich bin auch ein Verfechter von YAGNI und er muss sicher nicht zwei Monitore unterstützen.

Aus Sicht Clean-Code ist es trotzdem falsch. Es geht um "Screenshots". Wenn mal also den Screen möchte dann folgt daraus, dass man auch die Werte vom Screen nimmt und nicht ein "magic value" 0.

Redeemer 25. Aug 2020 12:22

AW: Screenshot
 
Zitat:

Zitat von himitsu (Beitrag 1472361)
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:

Richtig, da sucht man sich zu Tode. Korrekte Begründung für das Weglassen wäre somit eher:
Zitat:

Bei nur einem Monitor (den ich auch nur habe und auch immer nur haben werde) geht es.

delmi18 25. Aug 2020 16:15

AW: Screenshot
 
Zitat:

Zitat von TiGü (Beitrag 1472357)
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

Schließe mich an!

Medium 25. Aug 2020 21:33

AW: Screenshot
 
Muss man wirklich jedem nach gesundem Menschenverstand sinnvoll einsetzbaren Gedanken eine tolle Abkürzung geben, und es als "Design-Konzept" oder "Development Guidelines" oder was auch immer hochtrabendes bezeichnen? :roll:

Rollo62 26. Aug 2020 08:10

AW: Screenshot
 
DMWISS (*)


* - Das Muss Wohl Immer So Sein

Sherlock 26. Aug 2020 09:46

AW: Screenshot
 
Zitat:

Zitat von Rollo62 (Beitrag 1472394)
DMWISS (*)


* - Das Muss Wohl Immer So Sein

Danke für den Lacher am Morgen!!

:lol:

Sherlock

himitsu 26. Aug 2020 10:48

AW: Screenshot
 
DMWESS? das muss wohl einfach so sein :stupid:

Rollo62 26. Aug 2020 11:19

AW: Screenshot
 
Da Macht Wohl Einer Seinen Senf
dazu ?

KodeZwerg 26. Aug 2020 11:23

AW: Screenshot
 
Diese Möglichkeit Wusste Er Sicherlich Schon :lol:

Rollo62 26. Aug 2020 13:43

AW: Screenshot
 
Zitat:

Zitat von kodezwerg (Beitrag 1472413)
diese möglichkeit wusste er sicherlich schon :lol:

<ot>
rofl :-d
</ot>


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