Screenshot und Close modaler Dialoge
-
Hallo zusammen,
Ich möchte gern einige Dialoge dokumentieren die ich einfach nacheinander aufrufe.
Folgenden codeschnipsel habe ich gefunden um die Dialoge automatisch zu schliessen// http://stackoverflow.com/questions/14522540/close-a-messagebox-after-several-seconds public void CloseIt() { System.Threading.Thread.Sleep(2000); Microsoft.VisualBasic.Interaction.AppActivate( System.Diagnostics.Process.GetCurrentProcess().Id); SendKeys.SendWait(" "); }
jetzt suche ich nach einer Möglichkeit einen screenshot automatisch davon zu machen.
Praktisch ist es mir schon möglich durchBitmap bitmap = new Bitmap(control.Width, control.Height); control.DrawToBitmap(bitmap, new System.Drawing.Rectangle(new Point(0, 0), control.Size)); bitmap.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
Meine Frage ist jedoch wie ich den gerade angezeigten, modalen, automatisch schliessenden Dialog als Screenshot speichere.
Die Dialogklasse selbst möchte ich dabei nicht anfassen.Kann jemand helfen oder hat Erfahrungen mit ähnlichen Anforderungen ?
Danke und Gruß
Michael
-
Hallo,
ich finde deine "Schließen"-Methode alles andere als praktikabel.
Aus meiner Sicht wäre es besser, wenn das der modale Dialog selbst tun würde. Dies ließe sich über einen Timer realisieren, der genau einmal läuft. Im Tick-Event wird anschließend der Screenshot erstellt und dannach der Dialog geschlossen.
public partial class MyModalForm { Timer timer; protected override OnShown() { // timer initialisieren... ... timer.Tick += timer_tick; // timer starten timer.Start(); } void timer_tick(Object sender, EventArgs e) { // create screenshot this.TakeShot(); timer.Stop(); this.Close(); } }
Wird jetzt so nicht lauffähig sein, dürfte aber das wichtige wiederspiegeln.
-
Danke inflames2k für Deinen Hinweis,
ich muss jedoch nur den Dialog aufmachen ansehen und schließen, dafür darf der Code nicht verändert werden. Aus diesem Grund habe ich den gezeigten Weg beschritten.
Dies ist nur Code der dioe Dialoge optisch Testen soll und ich will mir das Klickern und Capturen etwas erleichtern, weil es doch einige Dialoge sind.
-
Das heißt du bist wirklich gezwungen alles von außerhalb durchzuführen? Lass mich raten, du befindest dich in einer anderen Anwendung?
EDIT:
Dein Code erweckt mir den Eindruck, das du den Dialog aus der Anwendung heraus öffnest und aus dieser heraus auch wieder schließt.-> Somit sollte dir die Instanz des Dialogs beim schließen bekannt sein. Daher meine Idee zum Screenshot:
public void CloseIt() { // wenn dialog wirklich bekannt this.TakeShot(meinDialog); System.Threading.Thread.Sleep(2000); Microsoft.VisualBasic.Interaction.AppActivate( System.Diagnostics.Process.GetCurrentProcess().Id); SendKeys.SendWait(" "); } void TakeShot(Form form) { Bitmap bitmap = new Bitmap(form.Width, form.Height); form.DrawToBitmap(bitmap, new System.Drawing.Rectangle(new Point(0, 0), form.Size)); bitmap.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg); }
-
Danke für den Ansatz.
Der aufgerufene Dialog sit eine Messagebox die Parameter mitbekommt.
Die Instanz wird durch den Aufruf einer statischen Methode erst dann erzeugt.
Leider komme ich da vorher nicht dran.
Gibt es weitere Möglichkeiten ?
Danke
-
Du machst einfach eine eigene MessageBox als Form mit z.B. dem Namen MBox (ohne ControlBox!) und verpasst dieser Form
einen Close-Button. Unter Close_Click() baust du den Aufruf eines Screenshots ein und schliesst die Form mit this.Close().Die andere Frage mit dem automatischen Schliessen der MessageBox von aussen bleibt mir suspekt.
-
Hallo berniebutt,
die Klasse wollte ich nicht anfassen daher fällt diese Lösung im Grunde leider aus.
- trotzdem danke