From daa555167cf0acf9b0a9681fdea1d056fb580f49 Mon Sep 17 00:00:00 2001 From: Fernando Andreu <2480661+fernandreu@users.noreply.github.com> Date: Sat, 22 Feb 2020 13:09:45 +0000 Subject: [PATCH 1/3] Ensure Process.MainWindowHandle is refreshed This will set _haveMainWindow to true only if _mainWindowHandle is non-zero. It also forces the latter to be reset during a Process.Refresh() call, hence allowing the re-evaluation of both. Fix #32690 --- .../src/System/Diagnostics/Process.Win32.cs | 2 +- .../src/System/Diagnostics/Process.Windows.cs | 1 + .../tests/ProcessTests.cs | 32 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) 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..1335b4c7d122d3 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs @@ -1509,6 +1509,38 @@ public void MainWindowHandle_GetNotStarted_ThrowsInvalidOperationException() var process = new Process(); Assert.Throws(() => process.MainWindowHandle); } + + [Fact(Skip = "Manual test")] + [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() From 2983c5eb7cf5605337a5a8ad7104a917bfd061c6 Mon Sep 17 00:00:00 2001 From: Fernando Andreu <2480661+fernandreu@users.noreply.github.com> Date: Mon, 24 Feb 2020 22:50:40 +0000 Subject: [PATCH 2/3] Mark test for local outerloop testing only --- .../System.Diagnostics.Process/tests/ProcessTests.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs index 1335b4c7d122d3..d8cda6f8a48903 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; @@ -1510,7 +1511,9 @@ public void MainWindowHandle_GetNotStarted_ThrowsInvalidOperationException() Assert.Throws(() => process.MainWindowHandle); } - [Fact(Skip = "Manual test")] + [Fact] + [OuterLoop] + [Trait(XunitConstants.Category, XunitConstants.IgnoreForCI)] // Pops UI [PlatformSpecific(TestPlatforms.Windows)] public void MainWindowHandle_GetWithGui_ShouldRefresh_Windows() { From e68afbfd8708aaba116172c565db86d295571738 Mon Sep 17 00:00:00 2001 From: Fernando Andreu <2480661+fernandreu@users.noreply.github.com> Date: Sat, 29 Feb 2020 09:01:05 +0000 Subject: [PATCH 3/3] Rename exePath constant to ExePath --- .../System.Diagnostics.Process/tests/ProcessTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs index d8cda6f8a48903..9c764672bf097d 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs @@ -1517,10 +1517,10 @@ public void MainWindowHandle_GetNotStarted_ThrowsInvalidOperationException() [PlatformSpecific(TestPlatforms.Windows)] public void MainWindowHandle_GetWithGui_ShouldRefresh_Windows() { - const string exePath = "notepad.exe"; - Assert.True(IsProgramInstalled(exePath)); + const string ExePath = "notepad.exe"; + Assert.True(IsProgramInstalled(ExePath)); - using (Process process = Process.Start(exePath)) + using (Process process = Process.Start(ExePath)) { try {