示例#1
0
        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);
            }
        }