Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Windows API / MS.NET Framework API (https://www.delphipraxis.net/20-library-windows-api-ms-net-framework-api/)
-   -   Screenshot von verstecktem Fenster erzeugen (https://www.delphipraxis.net/118294-screenshot-von-verstecktem-fenster-erzeugen.html)

CK_CK 4. Aug 2008 22:02


Screenshot von verstecktem Fenster erzeugen
 
Mit dieser Funktion kann man einen Screenshot eines Fensters machen, auch wenn dieses verdeckt oder versteckt ist.

Delphi-Quellcode:
function ScreenshotHidden(wnd: HWND; const bmp: TBitmap): Boolean;
var
  rec: TRect;   //zum Zwischenspeichern der Fenstergröße
  dllh: THandle; //Handle der user32.dll
  //Prototyp der verwendeten Funktion
  PrintWindow: function(sHandle: HWND; dHandle: HDC; nFlags: UINT): BOOL; stdcall;
begin
  Result := False;                    //Rückgabewert initialisieren
  dllh := GetModuleHandle(user32);    //dll dynamisch laden...
  if dllh <> 0 then
  begin
    @PrintWindow:= GetProcAddress(dllh , 'PrintWindow'); //die Funktionsadresse aus der Dll laden...
    if @PrintWindow <> nil then
    begin
      GetWindowRect(wnd, rec);          //Größe des Fensters auslesen...
      bmp.Width := rec.Right - rec.Left;  //...und die Bitmap-Größe anpassen
      bmp.Height := rec.Bottom - rec.Top;
      bmp.Canvas.Lock;                //Zugriff auf den Canvas für andere Threads blockieren
      try
        result := PrintWindow(wnd, bmp.Canvas.Handle, 0); //Das Fenster zeichnet sich
                                                          //selbst in das HDC des Bitmaps
      finally
        bmp.Canvas.Unlock;            //Zugriff wieder erlauben
      end;
    end;
  end;
end;
Die Funktion erwartet zwei Parameter:
wnd - Handle des Fensters, das kopiert werden soll
bmp - Bitmap, in das der Screenshot gespeichert wird

Aufrufen kann man die Funktion z.B. so:
(Screenshot von Notepad machen)
Delphi-Quellcode:
var
  wnd: HWnd;
begin
  wnd := FindWindow('Notepad',nil); //Handle vom Notepad-Fenster
  ScreenshotHidden(wnd, Image1.Picture.Bitmap);
  Image1.Invalidate;
end;
Ich habe lange nach so etwas gesucht und hoffe, es ist für noch jemanden hier nützlich ;)

Chris

[edit=Daniel G]Code formatiert Mfg, Daniel G[/edit]
[edit=Daniel G]toms Hinweis ergänzt Mfg, Daniel G[/edit]

Mithrandir 21. Okt 2009 13:36

Re: Screenshot von verstecktem Fenster erzeugen
 
toms weißt auf Folgendes hin:

Zitat:

Zitat von toms
Hallo,

Bei minimierten Fensteren gibt GetWindowRect für die Höhe / Breite immer -32000 zurück.
D.h ein Screenshot kann somit nicht von einem minimierten Fenster erstellt werden.



Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.

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