Wenn man ein Programm startet um später mit seiner GUI zu interagieren sollte man zunächst prüfen ob das Hauptfenster bereits erstellt wurde.
Diese Erweiterungsmethode vereinfacht das ein wenig.
namespace System.Diagnostics
{
using System;
using System.Threading;
public static class Process_Extensions
{
/// <summary>
/// Wartet solange bis das MainWindow des Prozesses erzeugt wurde.
/// </summary>
/// <param name="process">Der Prozess dessen MainWindow erzeugt werden soll.</param>
/// <returns><c>true</c> wenn der Prozess läuft und ein MainWindow hat; andernfalls <c>false</c></returns>
public static bool WaitForMainWindow(this Process process)
{
while (!process.HasExited && process.MainWindowHandle == IntPtr.Zero)
Thread.Sleep(10);
return !process.HasExited;
}
/// <summary>
/// Wartet solange bis das MainWindow des Prozesses erzeugt wurde, aber maximal <paramref name="timeout"/> Millisekunden.
/// </summary>
/// <param name="process">Der Prozess dessen MainWindow erzeugt werden soll.</param>
/// <param name="timeout">Die Zeit in Millisekunden die maximal gewartet werden soll, bevor die Methode zurück kehrt.</param>
/// <returns><c>true</c> wenn der Prozess läuft und ein MainWindow hat; andernfalls <c>false</c></returns>
public static bool WaitForMainWindow(this Process process,uint timeout)
{
var start = DateTime.Now;
while (!process.HasExited && process.MainWindowHandle == IntPtr.Zero)
{
Thread.Sleep(10);
if ((DateTime.Now - start).TotalMilliseconds >= timeout)
{
return false;
}
}
return !process.HasExited;
}
}
}
2 Kommentare zum Snippet