为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
万千封印 2023-04-16 10:06:48
我正在尝试使用屏幕上的按钮来执行 Tab 和 reverse Tab 的功能。我希望该应用程序使用这些其他按钮在“细分”按钮之间切换,然后用户能够使用 Enter 键选择一个。试图使程序完全可通过键盘导航。我曾尝试使用 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 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

但看起来这个库可能有一种新方法,我只需要弄清楚如何使用它


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


键盘输入


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


查看完整回答
反对 回复 2023-04-16
?
临摹微笑

TA贡献1982条经验 获得超2个赞

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


前任:


IntPtr handle = FindWindow(null, "YourApplicationName");

SetForegroundWindow(handle);

SendKeys.SendWait("{Tab}");

SendKeys.Flush();

如果您的 Tab 键顺序设置正确,它将在您指定的控件中按 Tab 键切换多少次。虽然这模拟了实际输入,所以如果您希望用户在系统选项卡顶部提供输入,它可能不太合适。


查看完整回答
反对 回复 2023-04-16
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信