[VC.net] Desktopinhalt kopieren



  • 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.



  • Du mußt Windows noch die Möglichkeit geben, die Messages abzuarbeiten.
    Verwende dafür dann z.B. "Application.DoEvents()" (nach this->Hide()).

    Außerdem solltest du "this->Hide()" auch in den if-Block schreiben (sonst kann es passieren, daß du das Fenster dauerhaft versteckst, wenn kein Item selektiert ist - außer du hast es wirklich so gewollt -)



  • Danke für Deine Antwort,

    Th69 schrieb:

    Du mußt Windows noch die Möglichkeit geben, die Messages abzuarbeiten.
    Verwende dafür dann z.B. "Application.DoEvents()" (nach this->Hide()).

    Application.DoEvents() hilft da alleine leider nicht weiter.
    Ich habe nun noch eine Warteschleife while (n++ < 200000) davorgesetzt
    und dann funktioniert es aber ich denke dies ist so nicht so sinnvoll.
    Gibt es da nich eine elegantere Lösung für das Timing-Problem?

    if (this.screensListBox.SelectedIndex > -1)
             {
                this.Hide();
                int n = 1;
                while (n++ < 200000)
                Application.DoEvents();
                string imageFileName = Path.GetTempFileName() + ".png";
                Bitmap captureBitmap = ImageUtils.GetScreenshot((Screen)this.screensListBox.SelectedItem);
                captureBitmap.Save(imageFileName);
                Process.Start(imageFileName); 
                this.Show();
             }
    


  • Application.DoEvents() hilft da alleine leider nicht weiter.

    Bad "DoEvents" ... alternativ mal nach "bad doevents" googeln - gibt noch einpaar schöne Treffer

    Gibt es da nich eine elegantere Lösung für das Timing-Problem?

    ein Timer? ... oder Threads?


Log in to reply