Ejemplo n.º 1
0
        /// <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));
            }
        }