From e9e5c8c307f31e671b6dd8c8a52cd069910b7469 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 23 Feb 2022 14:01:44 -0800 Subject: [PATCH] Pass SendKeys state by ref (#6711) Regression introduced in 90f7c1dd955c51c904efd496731a2394cacf578f. Fixes #6666 Co-authored-by: Jeremy Kuhne --- .../src/System/Windows/Forms/SendKeys.cs | 10 ++--- .../System/Windows/Forms/SendKeysTests.cs | 41 +++++++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/SendKeysTests.cs diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/SendKeys.cs b/src/System.Windows.Forms/src/System/Windows/Forms/SendKeys.cs index 9d8299fc28d..03a1e79a19b 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/SendKeys.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/SendKeys.cs @@ -170,7 +170,7 @@ private static bool AddSimpleKey( } AddMsgsForVK(vk & 0xff, repeat, haveKeys.HaveAlt > 0 && haveKeys.HaveCtrl == 0, hwnd); - CancelMods(haveKeys, UnknownGrouping, hwnd); + CancelMods(ref haveKeys, UnknownGrouping, hwnd); } else { @@ -205,7 +205,7 @@ private static void AddMsgsForVK(int vk, int repeat, bool altnoctrldown, IntPtr /// Called whenever there is a closing parenthesis, or the end of a character. This generates events for the /// end of a modifier. /// - private static void CancelMods((int HaveShift, int HaveCtrl, int HaveAlt) haveKeys, int level, IntPtr hwnd) + private static void CancelMods(ref (int HaveShift, int HaveCtrl, int HaveAlt) haveKeys, int level, IntPtr hwnd) { if (haveKeys.HaveShift == level) { @@ -519,7 +519,7 @@ private static void ParseKeys(string keys, IntPtr hwnd) } AddMsgsForVK(vk, repeat, haveKeys.HaveAlt > 0 && haveKeys.HaveCtrl == 0, hwnd); - CancelMods(haveKeys, UnknownGrouping, hwnd); + CancelMods(ref haveKeys, UnknownGrouping, hwnd); } else if (keyName.Length == 1) { @@ -604,7 +604,7 @@ private static void ParseKeys(string keys, IntPtr hwnd) throw new ArgumentException(string.Format(SR.InvalidSendKeysString, keys)); } - CancelMods(haveKeys, cGrp, hwnd); + CancelMods(ref haveKeys, cGrp, hwnd); cGrp--; if (cGrp == 0) { @@ -632,7 +632,7 @@ private static void ParseKeys(string keys, IntPtr hwnd) throw new ArgumentException(SR.SendKeysGroupDelimError); } - CancelMods(haveKeys, UnknownGrouping, hwnd); + CancelMods(ref haveKeys, UnknownGrouping, hwnd); } /// diff --git a/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/SendKeysTests.cs b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/SendKeysTests.cs new file mode 100644 index 00000000000..f9be48bbc7e --- /dev/null +++ b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/SendKeysTests.cs @@ -0,0 +1,41 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Xunit; + +namespace System.Windows.Forms.Tests +{ + public class SendKeysTests + { + [WinFormsFact(Skip = "This test depends on focus and should be run manually.")] + public void SendKeysGrouping() + { + // Regression https://github.com/dotnet/winforms/issues/6666 + + using var form = new CaptureForm(); + form.Show(); + form.Focus(); + SendKeys.SendWait("^(a)^(c)"); + + Assert.Equal(4, form.KeyEvents.Count); + Assert.Equal(Keys.ControlKey, form.KeyEvents[0].KeyCode); + Assert.Equal(Keys.A, form.KeyEvents[1].KeyCode); + Assert.Equal(Keys.Control, form.KeyEvents[1].Modifiers); + Assert.Equal(Keys.ControlKey, form.KeyEvents[2].KeyCode); + Assert.Equal(Keys.C, form.KeyEvents[3].KeyCode); + Assert.Equal(Keys.Control, form.KeyEvents[3].Modifiers); + } + + private class CaptureForm : Form + { + public List KeyEvents { get; } = new(); + + protected override void OnKeyDown(KeyEventArgs e) + { + KeyEvents.Add(e); + base.OnKeyDown(e); + } + } + } +}