diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs index 4f2f6acbc22fb7..565b02ea19e056 100644 --- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs +++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs @@ -243,7 +243,7 @@ public IntPtr MainWindowHandle EnsureState(State.IsLocal | State.HaveId); _mainWindowHandle = ProcessManager.GetMainWindowHandle(_processId); - _haveMainWindow = true; + _haveMainWindow = _mainWindowHandle != IntPtr.Zero; } return _mainWindowHandle; } diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs index 99ac93fd33bc61..b8a3bb1339f70c 100644 --- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs +++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs @@ -116,6 +116,7 @@ public void Kill() private void RefreshCore() { _signaled = false; + _haveMainWindow = false; } /// Additional logic invoked when the Process is closed. diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs index 4573c160d182b6..9c764672bf097d 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs @@ -15,6 +15,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.DotNet.RemoteExecutor; +using Microsoft.DotNet.XUnitExtensions; using Microsoft.Win32.SafeHandles; using Xunit; using Xunit.Sdk; @@ -1509,6 +1510,40 @@ public void MainWindowHandle_GetNotStarted_ThrowsInvalidOperationException() var process = new Process(); Assert.Throws(() => process.MainWindowHandle); } + + [Fact] + [OuterLoop] + [Trait(XunitConstants.Category, XunitConstants.IgnoreForCI)] // Pops UI + [PlatformSpecific(TestPlatforms.Windows)] + public void MainWindowHandle_GetWithGui_ShouldRefresh_Windows() + { + const string ExePath = "notepad.exe"; + Assert.True(IsProgramInstalled(ExePath)); + + using (Process process = Process.Start(ExePath)) + { + try + { + for (int attempt = 0; attempt < 50; ++attempt) + { + process.Refresh(); + if (process.MainWindowHandle != IntPtr.Zero) + { + break; + } + + Thread.Sleep(100); + } + + Assert.NotEqual(IntPtr.Zero, process.MainWindowHandle); + } + finally + { + process.Kill(); + Assert.True(process.WaitForExit(WaitInMS)); + } + } + } [Fact] public void MainWindowTitle_NoWindow_ReturnsEmpty()