/// <summary> /// Gets the main window of the application's process. /// </summary> /// <param name="waitTimeout">An optional timeout. If null is passed, the timeout is infinite.</param> /// <returns>The main window object as <see cref="Window" /> or null if no main window was found within the timeout.</returns> public Window GetMainWindow(TimeSpan?waitTimeout = null) { this.ThrowIfDisposed(); if (this.mainWindow != null) { return(this.mainWindow); } var start = DateTime.Now; this.WaitForMainWindow(waitTimeout); if (this.mainWindow != null) { return(this.mainWindow); } lock (this.gate) { if (this.mainWindow != null) { return(this.mainWindow); } var mainWindowHandle = this.MainWindowHandle; if (mainWindowHandle == IntPtr.Zero) { throw new InvalidOperationException($"Did not find main window for {this.processReference.Process.ProcessName}. If startup is slow try with a longer wait."); } if (waitTimeout != null) { waitTimeout = waitTimeout - (DateTime.Now - start); } Wait.UntilResponsive(mainWindowHandle, waitTimeout ?? TimeSpan.MaxValue); return(this.mainWindow = new Window(AutomationElement.FromHandle(mainWindowHandle), isMainWindow: true)); } }