AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Screenshot des aktiven Fenster genau wie Alt+Druck

Screenshot des aktiven Fenster genau wie Alt+Druck

Ein Thema von Alex_ITA01 · begonnen am 2. Okt 2015 · letzter Beitrag vom 4. Jul 2016
Antwort Antwort
Seite 1 von 2  1 2   
Alex_ITA01

Registriert seit: 22. Sep 2003
1.064 Beiträge
 
Delphi 10.4 Sydney
 
#1

Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Okt 2015, 08:48
Hallo zusammen,
ich erstelle wie folgt ein Screenshot eines Fensters:

Delphi-Quellcode:
var
  aFormat : Word;
  aBMP : TBitMap;
  AData : THandle;
  APalette : HPALETTE;

  procedure ScreenShot(Wnd: HWND; ATo: TBitmap);
  var
    hDCMem : HDC;
    DC : HDC;
    rect : TRect;
    bmp : HBITMAP;
    hOld : HGDIOBJ;
  begin
    hDCMem := CreateCompatibleDC(0);

    GetWindowRect(Wnd, rect);

    DC := GetDC(Wnd);
    bmp := CreateCompatibleBitmap(DC, rect.Right-rect.Left, rect.Bottom-rect.Top);
    ReleaseDC(Wnd, DC);

    hOld := SelectObject(hDCMem, bmp);
    SendMessage(wnd, wm_Print, hDCMem, PRF_CHILDREN or PRF_CLIENT or PRF_ERASEBKGND or PRF_NONCLIENT or PRF_OWNED);

    SelectObject(hDCMem, hold);
    DeleteObject(hDCMem);

    ATo.FreeImage;
    ATo.Handle := bmp;
  end;

begin
  aBMP := TBitmap.Create;
  try
    ScreenShot(Self.Handle, aBMP); //<- Self.Handle ist meine "Form1"

    // Bild in Zwischenablage
    aBMP.SaveToClipBoardFormat(aFormat, AData, APalette);
    ClipBoard.SetAsHandle(aFormat,AData);
  finally
    aBMP.Free;
  end;
Das funktioniert auch soweit.
Nur wenn ich eine zweite Form über diese Form1 lege und dann den Screenshot mache, dann wird nur von der Form1 der Screenshot erstellt aber das was von Form2 in dem sichtbaren Bereich der Form1 ist, wird nicht mitgenommen. Also die Funktion sollte so sein, wie Alt+PrintScreen. Da wird ja einfach das aktuelle Fenster ge-screenshot-et bis zum jeweiligen Rahmen. Auch wenn andere Fenster in dem sichtbaren Bereich rein ragen, wird eben deren Ausschnitt auch genommen.

Habt ihr eine Idee, wie man genau das macht? Oder kann ich einfach die Tastenkombination Alt+PrintScreen als Command abschicken, das würde mir auch reichen.

Grüße
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Okt 2015, 09:19
To simulate the ALT-PRINTSCREEN keyboard combination use this line i.e. to capture the active window:

keybd_event(VK_SNAPSHOT, 1, 0, 0);


To simulate the PRINTSCREEN keyboard button press use this line i.e. to capture the entire screen:

keybd_event(VK_SNAPSHOT, 0, 0, 0);
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.064 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Okt 2015, 09:35
It works, fine.
Thanks
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Okt 2015, 15:57
An alternative more "clean" solution is MSDN-Library durchsuchenPrintWindow.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Okt 2015, 16:33
http://www.delphibasics.info/home/de...lphisourcecode
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
909 Beiträge
 
Delphi 6 Professional
 
#6

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Okt 2015, 18:37
Oder nehme stat 'self.Handle' 'Screen.ActiveForm.Handle' dann wird immer der ScreenShot von dem aktuellen Fenster deiner App gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.206 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Jul 2016, 17:50
An alternative more "clean" solution is MSDN-Library durchsuchenPrintWindow.
Bin gerade auch auf diese Frage gestoßen und habe den Thread hier gefunden, daher lasse ich ihn noch mal aufleben.

Denn: Den Hinweis mit Printwindow fand ich erst mal gut, denn der funktioniert auch über mehrere Monitore und bei Fenstern mit oder ohne Rahmen und z.B. bei mit der VCL benutzen Fensterstyles.

Allerdings:

Das Fenster wird immer im Windows-Basis Stil gemalt, nicht so wie es aktuell auf dem Monitor angezeigt wird (siehe anliegenden Screenshot).

Kann man das noch irgendwie beeinflussen?
Miniaturansicht angehängter Grafiken
window.jpg  

Geändert von Harry Stahl ( 2. Jul 2016 um 17:57 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
909 Beiträge
 
Delphi 6 Professional
 
#8

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Jul 2016, 19:21
Teste doch mal:

Delphi-Quellcode:
Type
  TScreenShotSource = (sssActiveForm,sssActiveFormClient,sssPrimaryScreen,sssDesktopScreen);

procedure MakeScreenShot(const ATarget: TBitmap;ASource : TScreenShotSource;ASourceHandle : HWND = 0);
var
  tmpHandel : HWND;
  SourceDC: HDC;
  Rec: TRect;
begin
  tmpHandel := 0;
  SourceDC := 0;

  try
    ATarget.PixelFormat := pfDevice;
    if ASourceHandle > 0 then begin
      tmpHandel := ASourceHandle;
      case ASource of
        sssActiveFormClient : begin
                                SourceDC := GetDc(tmpHandel);
                                GetClientRect(tmpHandel,Rec);
                              end;
        else begin
          SourceDC := GetWindowDc(tmpHandel);
          GetWindowRect(tmpHandel,Rec);
        end;
      end;
    end else begin
      case ASource of
        sssActiveForm : begin
                                tmpHandel := GetForegroundWindow;
                                SourceDC := GetWindowDc(tmpHandel);
                                GetWindowRect(tmpHandel,Rec);
                              end;
        sssActiveFormClient : begin
                                tmpHandel := GetForegroundWindow;
                                SourceDC := GetDc(tmpHandel);
                                GetClientRect(tmpHandel,Rec);
                              end;
        sssPrimaryScreen : begin
                                tmpHandel := GetDesktopWindow;
                                SourceDC := GetDc(tmpHandel);
                                GetWindowRect(tmpHandel,Rec);
                              end;
        sssDesktopScreen : begin
                                tmpHandel := GetDesktopWindow;
                                SourceDC := GetDc(tmpHandel);
                                Rec.Left := 0;
                                Rec.Top := 0;
                                Rec.Right := Screen.DesktopWidth;
                                Rec.Bottom := Screen.DesktopHeight;
                              end;
        else exit;
      end;
    end;

    ATarget.Width := Rec.Right - Rec.Left;
    ATarget.Height := Rec.Bottom - Rec.Top;

    BitBlt(ATarget.Canvas.Handle, 0, 0, ATarget.Width, ATarget.Height, SourceDC, 0, 0, SRCCOPY);
  finally
    ReleaseDC(tmpHandel, SourceDC);
  end;
end;

Aufruf z.B.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  tmpBitMap : TBitMap;
begin
  tmpBitMap := TBitMap.Create;
  try
    case RadioGroup1.ItemIndex of
     0 : MakeScreenShot(tmpBitMap, sssPrimaryScreen);
     1 : MakeScreenShot(tmpBitMap, sssDesktopScreen);
     2 : MakeScreenShot(tmpBitMap, sssActiveForm);
     3 : MakeScreenShot(tmpBitMap, sssActiveFormClient);
     else exit;
    end;
    Image1.Picture.Assign(tmpBitMap);
  finally
    tmpBitMap.Free;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.206 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 3. Jul 2016, 01:21
@HolgerX: Danke für den Source, jedoch brauch ich es gar nicht zu probieren, da ich es zuvor schon so versucht hatte (bringt ungenaue Ergebnisse, wenn Fenster ohne Rahmen sind, oder z.B. VCL-Windows mit Styles).

Habe es jetzt so gelöst, dass ich für das Sammeln der verfügbaren Fenster die PrintWindow-Funktion nutze, da es hier erst mal nur eine Vorschau ist (siehe anliegenden Screenshot).

Für die Durchführung des tatsächlichen Screnshots für das gewählte Fenster arbeite ich dann mit der simulierten Tastaturfolge Alt+Druck (nur das bringt in allen Fällen korrekte Ergebnisse). Das geht dann zwar über die Zwischenablage, ist aber verschmerzbar (kleiner Tipp: man muss danach etwas warten, bis das Bitmap in der Zwischenablage ist, Windows braucht je nach Fenstergröße ein paar Millisekungen dafür).
Miniaturansicht angehängter Grafiken
screens.jpg  
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
909 Beiträge
 
Delphi 6 Professional
 
#10

AW: Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 3. Jul 2016, 08:42
Hmm..

meine Funktion arbeitet doch garnicht mit PrintWindow!?

Hab hier kein Win10 zum testen..
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:33 Uhr.
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