![]() |
Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
Hallo zusammen,
ich hab da mal eine Frage: Ich habe 2 Forms, die eine dient als Umrandung für ein Screenshot und über die andere Form starte ich den Screenshot per Button. Ich wollte jetzt, dass die Form, von wo aus ich das Screenshot starte, nicht mit aufs Bild kommt und mache vor der Funktion StretchBlt() ein Form1.Hide und danach wieder Form1.Show. Trotzdem ist auf sehr schnellen Rechnern das Formular mit auf dem Bild. Kann man das irgendwie verhindern, ohne eine lange Wartezeit zwischen Form1.Hide und StretchBlt() einzufügen?
Delphi-Quellcode:
Bin für jeden Tipp dankbar.
Form1.Hide;
StretchBlt(ATarget.Canvas.Handle, 0, 0, ATarget.Width, ATarget.Height, DesktopDC, Form2.Left, Form2.Top, Form2.Width, Form2.Height, SRCCOPY); Form1.Show; Liebe Grüsse, Andy. Delphi 2005 PE |
Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
Versuch mal ein Application.ProcessMessages; nach dem Form1.Hide .
Ansonsten gab's noch 'nen Befehl, welcher ein Neuzeichnen des Desktops veranlaßte, aber das braucht ja auch 'ne Zeit und es gibt keine sichere Methode rauszubekommen, ob und wann alle Programme ihre Fenster fert gezeichnet haben. |
Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
Ich würde ganz klar auf das fehlende Verarbeiten von Messages tippen. Die Methode Hide stößt nur das ausblenden an (schickt sozusagen eine Nachricht). Aber wenn die Nachricht gar nicht verarbeitet wird (machst du ja nirgends) so wird natürlich auch nix ausgeblendet.
Wie bereits erwähnt solltest du einfach mit Application.ProcessMessages dem Programm die Möglichkeit geben noch Nachrichten zu verarbeiten. |
Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
das mit ProcessMessages hatte ich schon mal versucht. Es ist zwar besser, aber es kommt immer noch vor, dass man die Form mit auf das Bild bekommt. Dabei habe ich festgestellt, dass, je mehr der PC ausgelastet ist (Delphi läuft z.B. :wink: ), umso eher schafft man es die Form mit auf das Bild zu bekommen. Anbei mal eine Beispieldatei, auf das Notwendigste reduziert. In Verzeichnis liegt auch ein Screenshot, wo man sieht, dass es bei mir nicht geht. Sonst noch jemand Ideen? Gruss, Andy. |
Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
Zitat:
|
Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
Aha,und nun?
Gibts ne Funktion oder nen Trick für ein globales Refresh? |
Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
ob es einen globalen Befehl gibt, weiß ich jetzt nicht, aber im Grunde muß du nur an alle Fenster einen Refrech-Befehl senden
hätte es jetzt irgendwie so vermutet, aber Delphi zeichnet sich nicht neu :gruebel:
Delphi-Quellcode:
aber wie schon gesagt, du kannst den anderen Programmen nur sagen DAS sie sich neu zeichen sollen, aber OB/WANN die es machen, ist damit nicht sichergestellt.
SendMessage(HWND_BROADCAST, WM_PAINT, 0, 0);
|
Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
Also ich hab das jetzt mal eingebaut, und bei mir scheint es zu funktionieren.
Zumindest auf meinem PC, ich muss das jetzt noch mal auf anderen PCs testen, da ich vorher auch schon ein paar Mal dachte ich hätte ne Lösung gefunden und auf anderen PCs tat es dann nicht. Auch wenn ich nicht weiss, ob es jetzt die endgültige Lösung ist: Vielen Dank für den Tipp! |
Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
Ich würde danach noch 'nen Sleep(0) einfügen, damit dein Programm erst nochmal kurz die CPU an andere Programme abgibt, oder eventuell gleich ein Sleep(20), damit die anderen Programme nich ein paar Zyklen mehr Zeit haben, um sich neu zu zeichnen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:47 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