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()