AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Thumbnail-Preview: Screenshot von Hauptform anzeigen

Thumbnail-Preview: Screenshot von Hauptform anzeigen

Offene Frage von "Michael II"
Ein Thema von juergen · begonnen am 6. Jan 2019 · letzter Beitrag vom 8. Jan 2019
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
883 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 01:48
Hallo zusammen,

ich kenne mich in dem Bereich leider zu wenig aus und habe nun schon einiges gesucht/probiert.
Folgendes nutze ich:

Delphi-Quellcode:
//globale variable
g_Bitmap_for_Thumbnail_Preview: TBitmap;

...

procedure ScreenShotActiveWindow(my_Image: TBitmap);
var
  c: TCanvas;
  R, t: TRect;
  h : THandle;
begin
  c := TCanvas.Create;
  c.Handle := GetWindowDC(GetDesktopWindow);
  h := GetForeGroundWindow;
  if h <> 0 then
      GetWindowRect(h, t);
  try
    R := Rect(0, 0, t.Right - t.Left, t.Bottom - t.Top);
    my_Image.Width := t.Right - t.Left;
    my_Image.Height := t.Bottom - t.Top;
    my_Image.Canvas.CopyRect(R, c, t);
  finally
    ReleaseDC(0, c.Handle);
    c.free;
  end;
end;

...

//Timer
procedure Tfrm_Main.tmr_ScreenshotTimer(Sender: TObject);
begin
  if (frm_Main.WindowState <> wsMinimized) and (gb_Hauptform_Aktiv) then begin
    ScreenShotActiveWindow(g_Bitmap_for_Thumbnail_Preview);
  end;
end;
Ich mache also über einen Timer einen Screenshot von meinem Programm.
In dem Programm kann man mehrere andere Forms aufrufen.

Und nun mein Problem.
Sobald ich eine andere Form aus dem Hauptprogramm aufgerufen habe, erscheint auf dem Screenshot dauerhaft weiterhin die Hauptform, aber auch die anderen Forms!
Tja, und da komme ich momentan nicht weiter.

Hat hier jemand einen Tipp für mich?

Edit: Die "Unter"-Forms schließe ich [über Close()], trotzdem sind *danach* diese "Unter"-Forms dauerhaft über der Hauptform auf dem Screenshot zu sehen, obwohl ja nur die Hauptform für den User zu sehen ist.

Vielen Dank schon mal vorab!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen ( 6. Jan 2019 um 01:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.019 Beiträge
 
Delphi 2010 Architect
 
#2

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 09:36
Zitat:
GetForeGroundWindow
Eventuell hilft SetForeGroundWindow aber keine garantie das es unter Windows 10 funktioniert wie so vieles andere nicht!
https://www.experts-exchange.com/que...0-Seattle.html
https://www.delphipraxis.net/1378231-post1.html

vielleicht noch
SetWindowPos mit dem Flag HWND_TOPMOST und
https://dotnet-snippets.de/snippet/f...s-bringen/1005

Keinerlei gewähr aber zumindest habe ich versucht zu helfen.

gruss

Geändert von EWeiss ( 6. Jan 2019 um 10:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
883 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 13:35
@EWeiss,

danke für deine Bemühungen!
Leider funktioniert das nicht. Es liegt an GetWindowDC(GetDesktopWindow); und da habe ich keine Alternativen gefunden.

Inzwischen habe ich zumindest einen Workaround gefunden.

Delphi-Quellcode:
procedure Tfrm_OpenFileDialog.FormClose(Sender: TObject; var Action: TCloseAction);
...
  frm_OpenFileDialog.Hide; // "Unterform" unsichtbar machen...
  frm_Main.Hide;
  Sleep(10);
  frm_Main.Visible := True;
end;
Wenn man also die *Hauptform* beim Schließen einer "Unter"-Form kurz "unsichtbar" macht und dann "sofort" wieder sichtbar, dann zeigt die Windows API GetWindowDC(GetDesktopWindow) auch nur noch die Hauptform ohne die zuvor geöffnete "Unter"-Form an.
Natürlich ist das nicht schön, da das Programm kurz "flackert", aber eine andere Lösung kann ich momentan nicht finden.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen ( 6. Jan 2019 um 14:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.019 Beiträge
 
Delphi 2010 Architect
 
#4

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 13:44
Zitat:
Leider funktioniert das nicht. Es liegt an GetWindowDC(GetDesktopWindow);und da habe ich keine Alternativen gefunden.
Und das ist falsch.. sorry
Zitat:
erscheint auf dem Screenshot dauerhaft weiterhin die Hauptform, aber auch die anderen Forms!
Ist auch logisch oder?
Du schreibst selbst "ScreenShotActiveWindow"
Ist der Desktop das aktive Window?

Wenn du ein spezifisches Fenster aufnehmen willst warum nimmst du dann das DC des Desktops?
Denke das ist dann wohl der falsche weg.

Man nehme das DC des Fensters das im Vordergrund ist.
Oder aber du willst den kompletten Desktop inklusive des Fensters was im Vordergrund ist.
Nun dann macht es aber keinen sinn das Fenster das du aufnehmen willst in den Vordergrund zu legen da dann alles aufgenommen wird was auf dem Desktop sichtbar ist.

Es sollte dann so sein.

Delphi-Quellcode:
h := GetForeGroundWindow;
c.Handle := GetWindowDC(h);
Alternativ einfach GetDC(h);

gruss

Geändert von EWeiss ( 6. Jan 2019 um 13:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
883 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 14:07
@EWeiss,

ja, ich will ein Screenshot von meinem Hauptprogramm und nicht von dem gesamten Desktop.
Deine Vorschläge hatte ich auch schon probiert, das Verhalten bleibt aber gleich. Die zwischenzeitlich geöffneten "Unterformen" werden im Screenshot über der Hauptform mit angezeigt...
Erst wenn man die Hauptform minimiert und dann wieder maximiert, wird in dem Screenshot auch nur noch die Hauptform meines Programms angezeigt.
Für das Verhalten zur Laufzeit: Im Moment sehe ich nur eine Lösung über meinen Workaround.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.019 Beiträge
 
Delphi 2010 Architect
 
#6

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 14:12
Zitat:
ja, ich will ein Screenshot von meinem Hauptprogramm und nicht von dem gesamten Desktop.
Nun wie ich schon sagte das DC des Desktop ist dann falsch

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
Ort: Oberreichenbach
16.344 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 14:43
Hol dir doch direkt den Zeiger für das aktive Formular

TScreen.ActiveForm
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
778 Beiträge
 
Delphi 7 Professional
 
#8

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 15:51
Vom Formular?

Hat das nicht die Methode GetFormImage.

Für mein Hilfe brauche ich für alle Formulare ein JPG. Das mache ich so:
Delphi-Quellcode:
{ Bildschirmfoto eines Formulars machen und als JPeg speichern.                }
procedure HardCopy(sJpegFile : String; fm : TForm);
Var
          FStream : TStream;
          FBmp : TPicture;
          FJpeg : TJpegImage;
begin
  if SysUtils.FileExists(sJpegFile) then SysUtils.DeleteFile(sJpegFile);
  FStream := TFileStream.Create(sJpegFile,fmCreate);
  fm.WindowState := wsNormal;
  fm.Show;
  fm.Refresh;
  FJpeg := TJpegImage.Create;
  FBmp := TPicture.Create;
  try
    FBmp.Bitmap.Assign(fm.GetFormImage);
    FJpeg.Assign(FBmp.Bitmap);
    FJpeg.SaveToStream(FStream);
  finally
    FStream.Free;
    FJpeg.Free;
    FBmp.Free;
  end;
end;

// Im Timer dann ungefähr sowas:
procedure Tfrm_Main.tmr_ScreenshotTimer(Sender: TObject);
begin
  if (Self.WindowState <> wsMinimized) and (gb_Hauptform_Aktiv) then begin
    HardCopy(Format('%s.jpg',[Self.Name]), Self);
  end;
end;
Das kann man dann bestimmt in etwa so anpassen:
Delphi-Quellcode:
procedure HardCopy(fm : TForm, bmp : TBitmap);
begin
  fm.WindowState := wsNormal;
  fm.Show;
  fm.Refresh;
  bmp.Assign(fm.GetFormImage);
end;

procedure Tfrm_Main.tmr_ScreenshotTimer(Sender: TObject);
begin
  if (Self.WindowState <> wsMinimized) and (gb_Hauptform_Aktiv) then begin
    HardCopy(Self, g_Bitmap_for_Thumbnail_Preview);
  end;
end;
Noch einfacher erscheint mit allerdings:
Delphi-Quellcode:
procedure Tfrm_Main.tmr_ScreenshotTimer(Sender: TObject);
begin
  if (WindowState <> wsMinimized) and (gb_Hauptform_Aktiv) then begin
    Refresh;
    g_Bitmap_for_Thumbnail_Preview.Assign(GetFormImage);
  end;
end;
Keine Ahnung, was davon jetzt am sinnvollsten ist und für Dich die beste Funktionalität hat. Und da zum Teil hier im Editor hingedaddelt, keine Gewähr für Fehlerfreiheit.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
883 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 6. Jan 2019, 18:01
@Delphi.Narium,

vielen Dank für deine Unterstützung!
GetFormImage scheint genau das richtige zu sein um den Screenshot von einer gewünschten Form zu erhalten. Wieder was gelernt.
Leider ist das Verhalten exakt dasselbe geblieben. In dem Screenshot wird die Hauptform und die zuvor geöffneten und dann geschlossenen "Unter"-Forms angezeigt.
Nur das minimieren und danach ein maximieren des Programms löst "irgendwas" aus, so dass dann der Screenshot auch nur noch die Hauptform anzeigt.
Prinzipiell kann ich mit meinem Workaround leben. Ich vermute, dass man der Hauptform "irgendein neues Zeichnen" auslösen muss. Probiert hatte ich Refresh, Show und Repaint, aber ohne Erfolg.

@Bernhard Geyer,
auch dir Danke für den Tipp!
Aber auch das behebt leider nicht mein Problem.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: Region Bern CH
223 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen

  Alt 7. Jan 2019, 23:09
Mit PrintWindow kannst du via Form Handle das von dir gewünschte Formular in eine BitMap speichern.

Es gibt dazu auch Delphi Code und weitere Infos hier im Forum.
Michael Gasser
  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 20:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf