Benutzer mit den meisten Antworten
Screenshot erstellen während Process.Start läuft

Frage
-
Hi zusammen, ich starte ein externes Programm von meiner Anwendung aus.
myProcess1.Start()myProcess1.WaitForExit()
myProcess1.Dispose()
Jetzt möchte ich von dieser Anwendung während sie läuft einen Screenshot erstellen. So als wenn ich jetzt ein Fenster markiere und alt+druck drücke.
Nur soll das ja passieren solange die Anwendung noch nicht beendet wurde. Da ich aber innerhalb meines Programmes darauf warte (myProcess1.WaitForExit()) muss ich das ja irgendwie anders lösen.
Antworten
-
Hallo,
nachdem du den Prozess gestartet hast, kannst du gleich den Screenshot erzeugen. Nachdem du den Screenshot erzeugt hast, rufst du WaitForExit auf.Nach dem starten solltest du vielleicht eine kurze Zeit warten um wirklich sicher zu stellen, das die Anwendung läuft.
Folgender Code wartet so lange, bis ein Hauptfenster erstellt wurde:p.Start() While p.MainWindowHandle = IntPtr.Zero Thread.Sleep(100)'100ms warten bis zur nächsten Abfrage' End While
Anschließend kannst du einen Screenshot machen.*
Nachdem dieser erfolgreich erstellt wurde rufst du WaitForExit() auf. Solte die Anwendung schon nicht mehr laufen wird einfach fort gefahren. Ist sie noch offen, wird das Programm angehalten, solange p noch läuft.
*Brauchst du noch hilfe beim Erstellen eines Screenshots? Darf die Anwendung dabei im Vordergrund sein?
Hier ist eine großteilig funktionierende Klasse, welche Screenshots erstellen kann. Diese ist zwar C#, aber in meiner Signatur findest du einen Konverter zu VB.NET.
(Die CaptureActiveWindow-Methode erstellt einen Screenshot des aktiven Fensters)Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Thomas Klinger2 Mittwoch, 12. März 2014 20:13
Alle Antworten
-
Hallo,
nachdem du den Prozess gestartet hast, kannst du gleich den Screenshot erzeugen. Nachdem du den Screenshot erzeugt hast, rufst du WaitForExit auf.Nach dem starten solltest du vielleicht eine kurze Zeit warten um wirklich sicher zu stellen, das die Anwendung läuft.
Folgender Code wartet so lange, bis ein Hauptfenster erstellt wurde:p.Start() While p.MainWindowHandle = IntPtr.Zero Thread.Sleep(100)'100ms warten bis zur nächsten Abfrage' End While
Anschließend kannst du einen Screenshot machen.*
Nachdem dieser erfolgreich erstellt wurde rufst du WaitForExit() auf. Solte die Anwendung schon nicht mehr laufen wird einfach fort gefahren. Ist sie noch offen, wird das Programm angehalten, solange p noch läuft.
*Brauchst du noch hilfe beim Erstellen eines Screenshots? Darf die Anwendung dabei im Vordergrund sein?
Hier ist eine großteilig funktionierende Klasse, welche Screenshots erstellen kann. Diese ist zwar C#, aber in meiner Signatur findest du einen Konverter zu VB.NET.
(Die CaptureActiveWindow-Methode erstellt einen Screenshot des aktiven Fensters)Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Thomas Klinger2 Mittwoch, 12. März 2014 20:13
-
Hallo Tom, ich bin es noch mal . Wie könnte ich das machen wenn ich
mit ja noch in meinem Programm in der Schleife befinde
myProcess1.Start()myProcess1.WaitForExit()
myProcess1.Dispose()
Ich aber jetzt unabhängig von diesem auf gestarteten Prozess (aber von dem Process Fenster) einen Screenshot machen möchte (zu einem beliebigen Zeitpunkt)
-
Hallo
die Frage ist hier, wie du heraus findet, das das 2. Programm soweit ist, das der Screenshot gemacht werden kann.Ich bin oben davon ausgegangen, dass der Screenshot direkt nach dem Starten des Programms erstellt wird.
Wenn du weißt, dass das Laden der Daten (oder was auch immer) ca. 10 Sekunden dauert, dann kannst du vor dem Erstellen des Bildes noch diese 10 Sekunden warten. (Mit Thread.Sleep(10000))
Danach erstellst du den Screenshot und rufst wieder WaitForExit auf.
Wenn dich das andere Programm irgendwie benachrichtigt, dann musst du das Event nur in einem 2. thread abonnieren. Dadurch wird in dem einen Thread auf das Ende des Prozesses gewartet und der andere erstellt den Screenshot aufgrund des Events.
Eventuell hast du auch die Möglichkeit in einer Schleife etwas vom 2. Programm zu überprüfen. Es gibt verschiedene API-Funktionen, beispielsweise um den Fenstertitel zu ermitteln. Dann kannst du in einer Schleife solange verbleiben, wie der Wert noch nicht stimmt. Bei jedem Durchlauf solltest du ein wenig warten, um nicht den Prozessor auszulasten.
Anschließend erstellst du den Screenshot und rufst wieder WaitForExit auf.Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo Tom , irgendwie will er vom neue Process Fenster keinen Screenshot erstellen.
ich rufe auf
.CaptureWindowRegion(myProcess1.MainWindowHandle) -->Hier habe ich auch eine Zahl des neuen Processes drin.Hier wird ja denn in deinem Beispiel
GetWindowRect(handle, out rect);return CaptureRegion((int)rect.Left, (int)rect.Top, (int)rect.Width, (int)rect.Height);
aufgerufen.
rect.left,top,width,height
ist immer 0 .
Woran kann das liegen?
Gruss