maniask Geschrieben 11. März 2010 Geschrieben 11. März 2010 Hallo! Ich habe ein großes Problem und hoffe ihr könnt mir helfen es zu lösen. Vor kurzem habe ich eine WPF-Anwendung geschrieben, bei dem man ein Fenster über den Bildschirm zieht und sich den dahinterliegenden Bildausschnitt mit einem Farbfilter umwandeln lässt. Das umgewandelte Bild wird mit einem Image im Fenster dargestellt. Das Programm läuft unter Windows XP ohne Probleme. Unter Windows Vista und Windows 7 erscheint in dem Fenster jedoch immer ein Bild vom vorherigen umgewandelten Bild, obwohl ich das Image vor dem CopyFromScreen auf Hidden setze, es wird immer mit umgewandelt. Mir fällt nichts mehr dazu ein. Hier ein paar C# Codeausschnitte: private void OnWindowLocationChanged(object sender, EventArgs e) { _Image.Visibility = Visibility.Hidden; ConvertScreenshot(); } private void ConvertScreenshot() { if (_Ms != null) { _Ms.Dispose(); } GetBitmap(); //hier erfolgt dann die Umwandlung von _Bmp _Ms = new MemoryStream(); _Bmp.Save(_Ms, ImageFormat.Bmp); _Image.Source = BitmapFrame.Create(_Ms); _Image.Visibility = Visibility.Visible; } private void GetBitmap() { _Bmp = new Bitmap(Convert.ToInt32(ActualWidth -BorderThickness.Left - BorderThickness.Right), Convert.ToInt32(ActualHeight - BorderThickness.Top - BorderThickness.Bottom - _Menu.ActualHeight)); Graphics g = Graphics.FromImage(_Bmp); g.CopyFromScreen(Convert.ToInt32(Left + BorderThickness.Left), Convert.ToInt32(Top + BorderThickness.Top + _Menu.ActualHeight), 0, 0, new System.Drawing.Size(_Bmp.Width, _Bmp.Height)); } Zitieren
Mcolli Geschrieben 12. März 2010 Geschrieben 12. März 2010 Moin, das Problem habe ich gefunden aber leider noch keine richtige Lösung: Das Problem ist dass das Layout deines Fenster / deiner Image vor dem Erzeugen der neuen Bitmap noch nicht geupdatet wurde, da das Erzeugen der BMP und das Updaten des Layout im selben Thread läuft und so mit dem Updaten gewartet wird während Du schon die Imageberechnest. Bei Windows XP wird das Problem nicht auftauchen da ein WPF Fenster dort in einem Windows.Forms Container läuft. Kopier mal folgenden Code rein. Du wirst bemerken dass es zu min. manchmal klappt (in dem Snippet ist die Zeitabstimmung zwichen dem WPF Thread und dem BMP Erzeugungsthread katastrophal aber ich hab nicht mehr so viel Zeit da meine Freundin auf der Bettkante wartet: private Thread t; private void test() { [INDENT] this.Dispatcher.Invoke(new ConvertScreenshotDelegate(ConvertScreenshot), new object[] { });[/INDENT] } private void ConvertScreenshot() { [INDENT]if (_Ms != null) { [INDENT] _Ms.Dispose();[/INDENT] } GetBitmap(); //hier erfolgt dann die Umwandlung von _Bmp _Ms = new MemoryStream(); _Bmp.Save(_Ms, ImageFormat.Bmp); _Image.Source = BitmapFrame.Create(_Ms);[/INDENT] } private void OnWindowLocationChanged(object sender, EventArgs e) { [INDENT] t = new Thread(new ThreadStart(new ConvertScreenshotDelegate(test))); _Image.Source = null; t.Start();[/INDENT] } private void GetBitmap() { [INDENT]_Bmp = new Bitmap(Convert.ToInt32(ActualWidth -BorderThickness.Left - BorderThickness.Right), Convert.ToInt32(ActualHeight - BorderThickness.Top - BorderThickness.Bottom - _Menu.ActualHeight)); Graphics g = Graphics.FromImage(_Bmp); g.CopyFromScreen(Convert.ToInt32(Left + BorderThickness.Left), Convert.ToInt32(Top + BorderThickness.Top + _Menu.ActualHeight), 0, 0, new System.Drawing.Size(_Bmp.Width, _Bmp.Height));[/INDENT] } Musste halt noch was dran arbeiten aber sollte der Denkanstoß in die richtige Richtung sein :upps Zitieren
maniask Geschrieben 15. März 2010 Autor Geschrieben 15. März 2010 Vielen, vielen Dank für deine Mühe und die schnelle Antwort! Super Denkanstoß. Gut, dass es solche Genies wie dich gibt, da wäre ich ja nie drauf gekommen! Zitieren
maniask Geschrieben 15. März 2010 Autor Geschrieben 15. März 2010 Das funktioniert einigermaßen, ist aber nicht so schön, da das Image unsichtbar bleibt, solange man das Fenster bewegt. Erst wenn das Fenster irgendwo kurz zum Stillstand kommt wird das Bild umgewandelt. Kann man nicht auch einen Screenshot ohne das oben liegende Programmfenster machen? Das würde ja alles vereinfachen, dann bräuchte man es nicht immer erst auf unsichtbar stellen. Geht das eventuell über den Z-Index oder die Z-Order? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.