Как смоделировать нажатие клавиши табуляции с помощью кода в UWP - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь использовать кнопки на экране для выполнения функции Tab и обратного Tab.Я хочу, чтобы приложение переключалось между кнопками «Сегмент» и другими кнопками, а затем пользователь мог выбрать одну из них с помощью клавиши «Ввод».Попытка сделать программу полностью управляемой с помощью клавиатуры.

demo layout

Я пытался использовать событие KeyDown, а затем навигацию с направленным фокусом, но мне больше хочется, чтобы система имитировала вкладкунажмите клавишу, чтобы перейти по пути вкладки.

Это код, который я пытался обойти, но это не совсем та функциональность, которую я хочу.

        private void Grid_KeyDown(object sender, KeyRoutedEventArgs e)
        {
            DependencyObject candidate = null;

            var options = new FindNextElementOptions()
            {
                SearchRoot = WeldPGrid,
                XYFocusNavigationStrategyOverride = XYFocusNavigationStrategyOverride.Projection
            };

            switch (e.Key)
            {
                case Windows.System.VirtualKey.Up:
                    candidate =
                        FocusManager.FindNextElement(
                            FocusNavigationDirection.Up, options);
                    break;
                case Windows.System.VirtualKey.Down:
                    candidate =
                        FocusManager.FindNextElement(
                            FocusNavigationDirection.Down, options);
                    break;
                case Windows.System.VirtualKey.Left:
                    candidate = FocusManager.FindNextElement(
                        FocusNavigationDirection.Left, options);
                    break;
                case Windows.System.VirtualKey.Right:
                    candidate =
                        FocusManager.FindNextElement(
                            FocusNavigationDirection.Right, options);
                    break;
            }
            // Also consider whether candidate is a Hyperlink, WebView, or TextBlock.
            if (candidate != null && candidate is Control)
            {
                (candidate as Control).Focus(FocusState.Keyboard);
            }
        }

Какокончательный результат Я хочу поместить смоделированное нажатие вкладки в событие щелчка или команду для кнопок сбоку, а не просто с помощью клавиш со стрелками.Любая помощь с этим вопросом будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Но похоже, что с этой библиотекой может быть доступен новый способ. Я просто должен выяснить, как ее использовать

Вы можете сослаться на Мартина Зикмундаввод в приложениях UWP blog.

Прежде чем мы используем ввод ввода, мы должны объявить эту возможность в манифесте приложения, поскольку это нестандартная функциональность.Это ограниченная возможность, что означает, что вы можете безопасно публиковать свое приложение в магазине приложений вместе с ним, но требовать одобрения для отправки в магазин.

Ввод с клавиатуры

Класс InjectedInputKeyboardInfo будет основой для ввода с клавиатуры.Наиболее важным свойством является VirtualKey, которое указывает, к какому ключу относится ввод.Используя KeyOptions, мы можем указать дополнительные параметры, такие как имитация события нажатия клавиши.

private async void Button_Click(object sender, RoutedEventArgs e)
{
    InputInjector inputInjector = InputInjector.TryCreate();
    for (int i = 0; i < 10; i++)
    {
        var info = new InjectedInputKeyboardInfo();
        info.VirtualKey = (ushort)(VirtualKey.Tab);
        inputInjector.InjectKeyboardInput(new[] { info });
        await Task.Delay(1000);
    }        
}

Обновление

Shift + Tab

InputInjector inputInjector = InputInjector.TryCreate();
 for (int i = 0; i < 10; i++)
 {
     var shift = new InjectedInputKeyboardInfo();
     shift.VirtualKey = (ushort)(VirtualKey.Shift);
     shift.KeyOptions = InjectedInputKeyOptions.None;


     var tab = new InjectedInputKeyboardInfo();
     tab.VirtualKey = (ushort)(VirtualKey.Tab);
     tab.KeyOptions = InjectedInputKeyOptions.None;


     inputInjector.InjectKeyboardInput(new[] { shift,tab});

     await Task.Delay(1000);
 }

Обновление 1

Для разблокировки ключа нам нужно установить параметр ключа как KeyUp и снова вызвать InjectKeyboardInput.

InputInjector inputInjector = InputInjector.TryCreate();
 var ctrl = new InjectedInputKeyboardInfo();
 ctrl.VirtualKey = (ushort)(VirtualKey.Control);
 ctrl.KeyOptions = InjectedInputKeyOptions.KeyUp;

 inputInjector.InjectKeyboardInput(new[] { ctrl });
0 голосов
/ 17 июня 2019

Вы можете использовать WIN32 API, получить дескриптор своего приложения и использовать SendKeys.SendWait("{Tab}");

EX:

IntPtr handle = FindWindow(null, "YourApplicationName");
SetForegroundWindow(handle);
SendKeys.SendWait("{Tab}");
SendKeys.Flush();

Если ваш порядок вкладок настроен правильно, он будет прокручивать ваши элементы управления, сколько раз вы указали. Хотя это имитирует фактический ввод, поэтому он может оказаться неуместным, если вы ожидаете, что пользователи будут вводить данные поверх вкладок системы.

Вот полезная ссылка , если вы хотите узнать больше о WIN32 API и симуляции ввода с клавиатуры и мыши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...