Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen (https://www.delphipraxis.net/133560-trotz-form1-hide-auf-screenshot-mit-stretchblt-zu-sehen.html)

PinKing2 4. Mai 2009 23:17


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:
Form1.Hide;

StretchBlt(ATarget.Canvas.Handle,
0,
0,
ATarget.Width,
ATarget.Height,
DesktopDC,
Form2.Left,
Form2.Top,
Form2.Width,
Form2.Height,
SRCCOPY);

Form1.Show;
Bin für jeden Tipp dankbar.

Liebe Grüsse,

Andy.

Delphi 2005 PE

himitsu 4. Mai 2009 23:56

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.

SirThornberry 5. Mai 2009 07:06

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.

PinKing2 5. Mai 2009 23:30

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.

himitsu 6. Mai 2009 00:16

Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
 
Zitat:

Zitat von PinKing2
das mit ProcessMessages hatte ich schon mal versucht. Es ist zwar besser, aber
es kommt immer noch vor, ...

Das Problem ist nicht, daß deine Form noch sichtbar ist, sondern daß die Form(en) dahinter sich noch nicht neu gezeichnet haben und somit noch das Abbild deiner Form auf diesen sichtbar ist.

PinKing2 6. Mai 2009 06:28

Re: Trotz Form1.Hide auf Screenshot mit StretchBlt zu sehen
 
Aha,und nun?

Gibts ne Funktion oder nen Trick für ein globales Refresh?

himitsu 6. Mai 2009 10:23

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:
SendMessage(HWND_BROADCAST, WM_PAINT, 0, 0);
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.

PinKing2 6. Mai 2009 18:23

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!

himitsu 6. Mai 2009 20:33

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 11:28 Uhr.

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