forumarbeit Geschrieben 18. Juni 2010 Geschrieben 18. Juni 2010 Hallo, Ich möchte z.B. mit folgender Routine den Desktopinhalt in eine Datei kopieren und dabei den eigenen Dialog mit den Button ausblenden. Wenn ich das Beispiel unten verwende, dann ist der eigene Dialog in der Grafik immer noch zu sehen. Wenn ich die selbe Routine im Debug Single-step laufen lasse, dann funktioniert es korrekt. Der eigene Dialogfenster wird versteckt, Der Screenshot erstellt und anschließend wird die eigene Dialogbox angezeigt. Kann mir jemand sagen, warum die während der normalen Programmlaufzeit nicht funktioniert bzw. die eigene Dialogbox vorm Screenshot nicht ausgeblendet wird? private void screenshotOfScreenButton_Click(object sender, System.EventArgs e) { this.Hide(); if (this.screensListBox.SelectedIndex > -1) { string imageFileName = Path.GetTempFileName() + ".png"; Bitmap captureBitmap = ImageUtils.GetScreenshot((Screen)this.screensListBox.SelectedItem); captureBitmap.Save(imageFileName); Process.Start(imageFileName); this.Show(); } } Danke. Zitieren
.NETter Geschrieben 25. Juni 2010 Geschrieben 25. Juni 2010 Hallo, also im Debug-Modus funktioniert es? Vielleicht hilft es nach dem ".Hide" ein "Application.DoEvents()" zu setzen? Es ist ja eine Oberflächenaktualisierung, die vielleicht einfach nicht so schnell abgearbeitet werden kann und der Screenshot vor der Aktualisierung erfolgt. Wie gesagt, nur eine Idee... Gruß, Thomas Zitieren
Mcolli Geschrieben 25. Juni 2010 Geschrieben 25. Juni 2010 Das Problem ist das die Form erst neu gezeichnet wird wenn der Code der Methode ausgeführt wurde, also mit verlassen Deiner Methode. Wenn Du das im Debug Modus testet, also mit Haltemarke, wird beim wechsel zum Code das Fenster minimiert ... das merkste daran dass Du auch nicht zum Fenster zurückkehren kannst während der Cursor auf der Haltemarke oder im Code steht. Du hast 2 Möglichkeiten: 1. Statt this.Hide() und anschließend this.Show() das hier schreiben: this.Opacity = 0; und anschliessend this.Opacity = 1; 2. Das erzeugen des Screenshots wird in einen andern Thread ausgelagert. Somit ist der "Gui"-Thread nicht belegt und das Fenster wird neu gerendert. Allerdings muss Du dann per Event, nach dem Erstellen des Screenshots, das Fenster wieder anzeigen lassen, da der Gui Thread ja wieder im "Warte Modus ist" und Du das Fenster nicht aus dem ScreenShot-Thread angesprochen werden kann (IllegalCorssThreadOperation). Zudem muss Deine Zeitsteuerung so gut sein, dass dem ScreenShotThread vom Shedular erst nach der Event-Abarbeitung des Gui-Thread Rechenzeit zugewisen wird. Also sehr viel Aufwand für einen kleinen *******. Man kann das Neumalen des Fensters NICHT durch: this.Refresh(); this.Invalidate(); Application.DoEvents(); o.ä. erzwingen. Dies ist auch der Grund warum ich bei der Verwendung einen Progressbalken, die Erhöhung des Fortschritts per event auslöse und die "lange Arbeit" im Hintergrund ausführen lasssen. Wenn man die "lange Arbeit" im Gui Thread verrichten lässt, hat man - abgesehen davon, dass die Oberfläche nicht reagiert - das Problem dass der Progressbalken erst nach Beendigung der "langen Arbeit" neu gemahlt wird. 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.