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

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

http://img3.mukewang.com/643b586b0001524806590352.jpg

我曾尝试使用 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 按下放在侧面按钮的单击事件或命令中,而不仅仅是使用方向键。对此问题的任何帮助将不胜感激!


万千封印
浏览 144回答 2
2回答

jeck猫

但看起来这个库可能有一种新方法,我只需要弄清楚如何使用它在我们使用输入注入之前,我们必须在应用程序清单中声明此功能,因为它是一个非标准功能。这是一项受限功能,这意味着您可以使用它安全地将您的应用程序发布到应用程序商店,但需要批准才能提交商店。键盘输入该类InjectedInputKeyboardInfo将作为键盘输入注入的基础。最重要的属性是 VirtualKey,它指定与哪个键相关的输入。使用 KeyOptions 我们可以指定更多选项,例如模拟按键弹起事件。private async void Button_Click(object sender, RoutedEventArgs e){&nbsp; &nbsp; InputInjector inputInjector = InputInjector.TryCreate();&nbsp; &nbsp; for (int i = 0; i < 10; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var info = new InjectedInputKeyboardInfo();&nbsp; &nbsp; &nbsp; &nbsp; info.VirtualKey = (ushort)(VirtualKey.Tab);&nbsp; &nbsp; &nbsp; &nbsp; inputInjector.InjectKeyboardInput(new[] { info });&nbsp; &nbsp; &nbsp; &nbsp; await Task.Delay(1000);&nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}更新Shift+TabInputInjector inputInjector = InputInjector.TryCreate();&nbsp;for (int i = 0; i < 10; i++)&nbsp;{&nbsp; &nbsp; &nbsp;var shift = new InjectedInputKeyboardInfo();&nbsp; &nbsp; &nbsp;shift.VirtualKey = (ushort)(VirtualKey.Shift);&nbsp; &nbsp; &nbsp;shift.KeyOptions = InjectedInputKeyOptions.None;&nbsp; &nbsp; &nbsp;var tab = new InjectedInputKeyboardInfo();&nbsp; &nbsp; &nbsp;tab.VirtualKey = (ushort)(VirtualKey.Tab);&nbsp; &nbsp; &nbsp;tab.KeyOptions = InjectedInputKeyOptions.None;&nbsp; &nbsp; &nbsp;inputInjector.InjectKeyboardInput(new[] { shift,tab});&nbsp; &nbsp; &nbsp;await Task.Delay(1000);&nbsp;}更新 1对于释放密钥,我们需要将密钥选项设置为KeyUp并再次调用InjectKeyboardInput。InputInjector inputInjector = InputInjector.TryCreate();&nbsp;var ctrl = new InjectedInputKeyboardInfo();&nbsp;ctrl.VirtualKey = (ushort)(VirtualKey.Control);&nbsp;ctrl.KeyOptions = InjectedInputKeyOptions.KeyUp;&nbsp;inputInjector.InjectKeyboardInput(new[] { ctrl });

临摹微笑

您可以使用 WIN32 API,获取应用程序的句柄并使用SendKeys.SendWait("{Tab}");前任:IntPtr handle = FindWindow(null, "YourApplicationName");SetForegroundWindow(handle);SendKeys.SendWait("{Tab}");SendKeys.Flush();如果您的 Tab 键顺序设置正确,它将在您指定的控件中按 Tab 键切换多少次。虽然这模拟了实际输入,所以如果您希望用户在系统选项卡顶部提供输入,它可能不太合适。
打开App,查看更多内容
随时随地看视频慕课网APP