Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Thumbnail-Preview: Screenshot von Hauptform anzeigen (https://www.delphipraxis.net/199205-thumbnail-preview-screenshot-von-hauptform-anzeigen.html)

juergen 6. Jan 2019 00:48


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:
//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. :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!

EWeiss 6. Jan 2019 08:36

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
 
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

juergen 6. Jan 2019 12:35

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
 
@EWeiss,

danke für deine Bemühungen! :-D
Leider funktioniert das nicht. Es liegt an
Delphi-Quellcode:
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. :oops:

EWeiss 6. Jan 2019 12:44

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
 
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

juergen 6. Jan 2019 13:07

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.

EWeiss 6. Jan 2019 13:12

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
 
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

Bernhard Geyer 6. Jan 2019 13:43

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
 
Hol dir doch direkt den Zeiger für das aktive Formular

TScreen.ActiveForm

Delphi.Narium 6. Jan 2019 14:51

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:
{ 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.

juergen 6. Jan 2019 17:01

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.

Michael II 7. Jan 2019 22:09

AW: Thumbnail-Preview: Screenshot von Hauptform anzeigen
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.
Seite 1 von 2  1 2      

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