我正在尝试使用屏幕上的按钮来执行Tab键和反转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键放入单击事件或侧面按钮的命令中,而不仅仅是使用方向键。 对于此问题的任何帮助将不胜感激!
答案 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。