private async Task SendKeysAsync(string text, int wordsPerMinute) { var charactersPerSecond = (wordsPerMinute * 4.5) / 60; var delayBetweenCharacters = (int)((1 / charactersPerSecond) * 1000); foreach (var character in text) { var foregroundWindow = IntPtr.Zero; var inputBlocked = false; try { inputBlocked = IntegrationHelper.BlockInput(); foregroundWindow = IntegrationHelper.GetForegroundWindow(); _visualStudioInstance.IntegrationService.Execute(typeof(RemotingHelper), nameof(RemotingHelper.ActivateMainWindow)); var vk = User32.VkKeyScan(character); if (vk == -1) { SendCharacter(character); } else { if ((vk & 0x0100) != 0) // SHIFT { SendKey(User32.VK_SHIFT, User32.KEYEVENTF_NONE); } if ((vk & 0x0200) != 0) // CTRL { SendKey(User32.VK_CONTROL, User32.KEYEVENTF_NONE); } if ((vk & 0x0400) != 0) // ALT { SendKey(User32.VK_MENU, User32.KEYEVENTF_NONE); } SendKey((ushort)(vk & 0xFF)); if ((vk & 0x0100) != 0) // SHIFT { SendKey(User32.VK_SHIFT, User32.KEYEVENTF_KEYUP); } if ((vk & 0x0200) != 0) // CTRL { SendKey(User32.VK_CONTROL, User32.KEYEVENTF_KEYUP); } if ((vk & 0x0400) != 0) // ALT { SendKey(User32.VK_MENU, User32.KEYEVENTF_KEYUP); } } } finally { if (foregroundWindow != IntPtr.Zero) { IntegrationHelper.SetForegroundWindow(foregroundWindow); } if (inputBlocked) { IntegrationHelper.UnblockInput(); } } await Task.Delay(delayBetweenCharacters); } }