none
Screenshot erstellen während Process.Start läuft RRS feed

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

    Mittwoch, 12. März 2014 13:47

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.

    Mittwoch, 12. März 2014 14:38
    Moderator

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.

    Mittwoch, 12. März 2014 14:38
    Moderator
  • 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)

    Donnerstag, 13. März 2014 10:23
  • 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.

    Donnerstag, 13. März 2014 10:41
    Moderator
  • 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

    Montag, 17. März 2014 12:09