![]() |
Thumbnail-Preview: Screenshot von Hauptform anzeigen
Hallo zusammen,
ich kenne mich in dem Bereich leider zu wenig aus und habe nun schon einiges gesucht/probiert. Folgendes nutze ich:
Delphi-Quellcode:
Ich mache also über einen Timer einen Screenshot von meinem Programm.
//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; In dem Programm kann man mehrere andere Forms aufrufen. Und nun mein Problem. :oops: 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! |
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
Zitat:
![]() ![]() vielleicht noch SetWindowPos mit dem Flag HWND_TOPMOST und ![]() Keinerlei gewähr aber zumindest habe ich versucht zu helfen. gruss |
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
@EWeiss,
danke für deine Bemühungen! :-D Leider funktioniert das nicht. Es liegt an
Delphi-Quellcode:
und da habe ich keine Alternativen gefunden.
GetWindowDC(GetDesktopWindow);
Inzwischen habe ich zumindest einen Workaround gefunden.
Delphi-Quellcode:
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.
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; Natürlich ist das nicht schön, da das Programm kurz "flackert", aber eine andere Lösung kann ich momentan nicht finden. :oops: |
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
Zitat:
Zitat:
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:
Alternativ einfach GetDC(h);
h := GetForeGroundWindow;
c.Handle := GetWindowDC(h); gruss |
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
@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. |
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
Zitat:
gruss |
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
|
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
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:
Das kann man dann bestimmt in etwa so anpassen:
{ 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;
Delphi-Quellcode:
Noch einfacher erscheint mit allerdings:
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;
Delphi-Quellcode:
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.
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; |
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
@Delphi.Narium,
vielen Dank für deine Unterstützung! :thumb: 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. |
AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
Mit
![]() Es gibt dazu auch Delphi Code und weitere Infos hier im Forum. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz