Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...