[gelöst] Screenshot eines Fensters

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

[gelöst] Screenshot eines Fensters

Beitrag von Linkat »

Hallo,
ich möchte automatisiert (z. B. mit einem Timer) Screenshots eines Fensters machen.

Mit Hilfe von
http://lazarus.firmos.at/index.php?topic=8967.0
funktioniert der Screenshot des Desktops ganz gut. Aber wie kann ich gezielt auf ein Fenster zugreifen?

Wer hat einen Tipp?

Vielen Dank.

Gruß, Linkat

ps: Das System auf dem das Programm laufen soll ist Windows NT!!.
Zuletzt geändert von Linkat am Fr 21. Jan 2011, 19:07, insgesamt 1-mal geändert.
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: [Frage offen] Screenshot eines Fensters

Beitrag von theo »

Linkat hat geschrieben: Wer hat einen Tipp?
Da musst du wohl erst via FindWindow und GetDC das DeviceContext Handle des Fensters bestimmen.
Google ist dein Freund.

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: [Frage offen] Screenshot eines Fensters

Beitrag von Linkat »

Vielen Dank theo,

die Schlüsselwörter
FindWindow und GetDC
bringen schon mal reichlich Informationen. Aber scheinbar wird die unit Windows benötigt, die meines Wissens für das OS Windows ist. Da ich jetzt schon zu Hause bin, wo mir kein Windows zu Verfügung steht, muss ich mit meinen Tests bis morgen warten. Oder gibt es für die unit Windows eine vergleichbare unit für Linux?

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: [Frage offen] Screenshot eines Fensters

Beitrag von theo »

Nö, aber du schreibst ja ausdrücklich es sei für Windows (NT).

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: [gelöst] Screenshot eines Fensters

Beitrag von Linkat »

Hallo,

so nun habe ich ein bischen herumgespielt. Die Schlüsselwörter FindWindow und GetDC waren schon richtig. Danke theo, für den Tipp.

Der Zugriff auf die WinAPI ist aber nicht ohne. Es gibt ein paar Ungereimtheiten (z. B. Screenshot zeigt die Fenster, die unter oder über dem eigentlichen Fenster sind an, deshalb SW_HIDE und SH_SHOW, es lassen sich manche Fenster mit dem Programmnamen ansprechen , manche nicht; es lassen sich manche Fenster mit dem Fensternamen ansprechen , manche nicht). Aber auf meinem WinNT-Rechner (Steuer-PC einer Machine) läuft das Programm wie es soll.

Hier ist der Beispiel-Code, vielleicht kann jemand daraus lernen:

Code: Alles auswählen

unit screendumpu;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Windows,Classes,SysUtils,FileUtil,Forms,Controls,Graphics,Dialogs,ExtCtrls,Buttons,
  StdCtrls,LCLIntf,LCLType;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BitBtn1:TBitBtn;
    btScreenDump:TButton;
    Image1:TImage;
    procedure btScreenDumpClick(Sender:TObject);
    procedure FormCreate(Sender:TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
 
procedure TForm1.FormCreate(Sender:TObject);
begin
  caption:='Screen Dump-Test';
 
end;
 
procedure TForm1.btScreenDumpClick(Sender:TObject);
var ScreenDC            :HDC;
    wnd                 :HWnd;
    ta,zeit             :string;
    jetzt               :TDateTime;
    AppName,FormCaption :PChar;
begin
  AppName:='notepad';         // 1a
  FormCaption:='Unbenannt - Editor'; // 1b
//  wnd:=FindWindow(AppName,nil);    // 2a
  wnd:=FindWindow(nil,FormCaption);  // 2b
  ShowWindow(wnd,SW_HIDE);    //
  ShowWindow(wnd,SW_SHOW);    //damit Fenster im Vordergrund
  Caption:=IntToStr(wnd);
  ScreenDC:= GetDC(wnd);
  image1.picture.PNG.LoadFromDevice(ScreenDC);
  ReleaseDc(wnd,ScreenDC);
  jetzt:=now;
  ta:=FormatDateTime('yymmdd',jetzt);
  zeit:=FormatDateTime('hhmmss',jetzt);
  Image1.Picture.SaveToFile(BilderPfad+'DispPattern-'+ta+'-'+zeit+'.png');
end;
 
end.
Je nachdem, ob das Fenster über Programmname oder Fenster-Überschrift gesucht werden soll, muss entweder 2a oder 2b auskommentiert sein.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: [Frage offen] Screenshot eines Fensters

Beitrag von Linkat »

Was muss man denn tun, dass man den Thread als gelöst kennzeichnen kann, was mann dann auch im ersten Beitrag sieht?
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Kiffi
Beiträge: 37
Registriert: Sa 27. Mär 2010, 11:39
OS, Lazarus, FPC: Windows 7 / Lazarus 1.0
CPU-Target: 32/64 bit

Re: [Frage offen] Screenshot eines Fensters

Beitrag von Kiffi »

Linkat hat geschrieben:Was muss man denn tun, dass man den Thread als gelöst kennzeichnen kann, was mann dann auch im ersten Beitrag sieht?
einfach im ersten Beitrag auf den Ändern-Button klicken.

Grüße ... Kiffi

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: [gelöst] Screenshot eines Fensters

Beitrag von Linkat »

Vielen Dank, Kiffi
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Antworten