Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[VC#] Desktopinhalt kopieren

Empfohlene Antworten

Veröffentlicht

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.

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.