如何使用UWP中的代码模拟Tab键按下

时间:2019-06-17 18:09:58

标签: c# xaml mvvm uwp

我正在尝试使用屏幕上的按钮来执行Tab键和反转Tab键的功能。我希望该应用程序通过“细分”按钮与其他按钮一起切换,然后用户可以使用Enter键选择一个。试图使程序可以通过键盘完全导航。

demo layout

我尝试过使用KeyDown事件,然后进行定向焦点导航,但是我更希望系统模拟按Tab键来跟随Tab路径。

这是我一直在尝试的代码,但这并不是我想要的功能。

        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);
            }
        }

最终的结果是,我希望将模拟的Tab键放入单击事件或侧面按钮的命令中,而不仅仅是使用方向键。 对于此问题的任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

  

但是看来我想弄清楚该库的使用方式

您可以参考Martin Zikmund的Injecting input in UWP apps博客。

  

在使用输入注入之前,我们必须在应用程序清单中声明此功能,因为它是非标准功能。这是一项受限制的功能,这意味着您可以安全地将应用与其一起发布到应用商店中,但需要获得商店提交的批准。

键盘输入

  

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 });

答案 1 :(得分:0)

您可以使用WIN32 API,获取应用程序的句柄并使用SendKeys.SendWait("{Tab}");

EX:

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

如果您的制表顺序设置正确,它将通过您的控件制表您指定的次数。尽管这模拟了实际的输入,所以如果您希望用户在系统选项卡的顶部提供输入,则可能会不太好。

如果您想了解有关WIN32 API以及鼠标和键盘输入模拟的更多信息,请访问helpful link