Schneller Screenshot
-
Hallo zusammen,
ich habe eine Anwendung gebaut, die nacheinander mehrere Screenshots erzeugt und diese dann (bei Veränderung) in einer Datei speichert.
Soll zur Doku von Bildschirmvorgängen dienen.Habe folgenden Code verwendet:
... TCanvas* canvas = new TCanvas(); canvas->Handle = GetWindowDC(GetDesktopWindow()); Dest = mySaveImage->ClientRect; Source = Rect(x,y,bildschirmbreite,bildschirmhoehe); mySaveImage->Canvas->CopyRect(Dest, canvas, Source); delete canvas; ...
"mySaveImage" ist das Bild (Bitmap) in dem nachher die Bildinfos drin stehen. Funktioniert auch so.
Problem ist dass dieser Vorgang ca. eine halbe Sekunde dauert und dabei alle(!) anderen Anwendung auch blockiert sind. Packe ich also diese Routine in einen Timer mit 1 Sekunde, dann ruckelt mein Rechner dermassen, dass ich die Maus kaum mehr bewegen kann.
Gibt es irgendwie eine "schnellere" Methode um einen Bildschirmabzug als Bitmap zu bekommen?
Zum Hintergrund: Ich werte danach das Bild mittels "Bitmap->ScanLine[...]" auf Veränderung aus. Ist etwas verändert, speichere ich.
Vielleicht gibt es auch Infos vom Betriebssystem falls ein Fenster sich ändert dass im Vordergrund ist. Dann könnte man nur dies "screenshotten" (winapi?).DANKE FÜR EURE HILFE!
Gruß
FreddyPS.: Es gibt zahlreiche Anwendungen für diesen Fall - bitte hier jetzt nicht über Sinn usw. hier diskutieren - das bringt mich nicht weiter.
-
Es gibt zahlreiche Anwendungen für diesen Fall
Dann nenn mal Namen.
-
Also es ist doch nicht zu glauben. Ich bat, hier nicht auf der Ebene des Vertriebs sondern auf der Ebene der Technik zu diskutieren und "kleine bitte" tut genau dies nicht
@kleine bitte:
Ich meine es gibt Anwendungsfälle bei denen dauerhaft auf Screenshots zugegriffen werden sollte. Z.B. beim erstellen von Kundenfilmen (z.B. RoboDemo), beim Mitloggen von Bildschirmabzügen zur Mitarbeiterüberwachung (sniffen) verpönt - nicht zulässig), ...@alle
Habt ihr irgendwelche Tipps für mein Problem?...Wäre es vielleicht eine Lösung, das Screenshotten in einen Thread zu verlagern?
DANKE!
-
Thread hilft immer.
Ausserdem solltest du in der Schleife bzw. im Timerevent nur das eigentliche Kopieren durchführen, das Bitmap-Objekt etc. muss ja nicht jedesmal neu erstellt werden.
Und hast du in der FAQ mal einen Blick auf "Screenshot - Version 1" geworfen? Evtl. ist das dort verwendete BitBlt() ja schneller als CopyRect.
-
Danke Jansen,
Deine Antworten sind wie immer sehr qualifiziert! (Lob
Hhhmm. Mal sehen vielleicht pack ich es in einen Thread. Aber das entkoppelt doch eigentlich nur die Arbeit von meiner Anwendung, oder?
Von Windows aus gesehen kann ich hier doch kein Performance Gewinn erzielen, oder?Vielleicht ist BitBlt ja wirklich schneller. Sollte man mal versuchen. Hat jemand dazu Erfahrungswerte?
Die Bitmaps sind schon global (mittels new) erzeugt. Werden also nicht in der Schleife jedes Mal neu erzeugt.
ScanLine scheint ja schon die schnellste Variante zum Bildvergleich zu sein, oder gibt es irgendwelche mathematischen Routinen (event. libs, etc.) die einen Bildvergleich durchführen? (Übertragung in den Frequenzbereich - ich erinnere mich gaaaaaanz dunkel?) Ich glaube auch das "kostet mich Laufzeit".
Gruß und Danke
Freddy
-
Diskussion zum Bildvergleich ausgelagert.