Имитация нажатия клавиши со стрелкой ВВЕРХ на клавиатуре для теста, выполняемого TestHost

Я пытаюсь программно имитировать нажатие клавиши со стрелкой ВВЕРХ на клавиатуре для сквозного теста. Тест выполняется под TestHost в Visual Studio.

Моя работа делится на 2 части:

1- Функция в приведенном ниже коде вставляется в тестируемое приложение. TestHost здесь не участвует. Оно работает. Стрелка ВВЕРХ принимается элементом управления и перемещает выбранное изображение. В контроле есть изображение. Элемент управления наследуется от UserControl (WinForms).

2- TestHost имитирует нажатие/нажатие клавиши, а также должен получать ее от системы. Когда TestHost запускает код, элемент управления не получает стрелку ВВЕРХ (или не отображается, потому что его координаты (x,y) остаются постоянными).

Элемент управления наследуется от класса UserControl (WinForms). Также нет межпотокового исключения, потому что я использовал Control.InvokeRequired().

Я подозреваю две причины проблемы:

1- TestHost не имеет возможности перекачивать очередь сообщений.

2- Тестируемое приложение не получает сообщение, потому что оно работает на более высоком уровне безопасности, чем TestHost. см. Может ли приложение блокировать вызовы SendInput?

Насколько я понимаю, я не думаю, что вторая причина действительна, потому что тестируемое приложение не запускается. Вместо этого его код запускается TestHost.

Это дополнительный вопрос по имитации нажатия клавиши со стрелкой ВВЕРХ (или других расширенных клавиш) на клавиатуре.

Вы знаете, почему \ можете ли вы предложить другое решение?

          public void SimulateKeystrokeEventMethod()
    {
        Thread.Sleep(10000);
        IntPtr handle = DesignPlanHelper.Handle;
        ushort key = (ushort)KB_UP;
        int repetitions = 30;

        Control control = Control.FromHandle(handle);

        if (control.InvokeRequired)
        {
            System.Action safeStimulation = delegate
            {
                SetFocus(handle);

                // The position of the antenna in the Design plan
                Clicks(handle, 330, 401);

                Input keyDown = new Input
                {
                        type = (int) InputType.Keyboard,
                        u = new InputUnion
                        {
                            ki = new KeyboardInput
                            {
                                wVk = 0, wScan = key, dwFlags = (uint) (KeyEventF.KeyDown | KeyEventF.Scancode), dwExtraInfo = GetMessageExtraInfo()
                            }
                        }
                };

                Input keyUp = new Input
                {
                    type = (int) InputType.Keyboard,
                    u = new InputUnion
                    {
                        ki = new KeyboardInput
                        {
                            wVk = 0, wScan = key, dwFlags = (uint) (KeyEventF.KeyUp | KeyEventF.Scancode), dwExtraInfo = GetMessageExtraInfo()
                        }
                    }
                };

                Input[] inputs = new Input[repetitions * 2];
                for (int input = 0; input < repetitions*2;)
                {
                    inputs[input] = keyDown;
                    input++;
                    inputs[input] = keyUp;
                    input++;
                }

                // You must pass all Key presses in a single call to this function.
                SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(Input)));
            };
            control.Invoke(safeStimulation);
        }
        else
        {
            //copy some code from above.
        }
    }

Ваша помощь очень ценится!

0 ответов

Другие вопросы по тегам