UWP 中的自定义应用内键盘
Custom In App Keyboard in UWP
我想在 UWP 中创建自定义屏幕键盘。它需要成为应用程序的一部分,因为它将用于大型 Table 或板设备,因此完全控制键盘位置非常重要(table 上的旋转)。
在 WPF 中,我已经通过创建带有目标 属性 的键盘控件来创建这样的自定义键盘。当按下一个键时,它会在目标上引发 KeyEvent 或 TextComposition UIElement.RaiseEvent(...)。
但是在UWP中,没有RaiseEvent函数,似乎没有办法为开发者引发路由事件。
我想使用本机文本事件(KeyDown 事件、TextComposition 事件等...),因此手动编辑 TextBox ( like this one ) 的文本 属性 的解决方案不被接受table.
This page 解释了如何创建一个监听 Text Services Framework 的控件。我认为一种解决方案是创建自定义文本服务,但我没有找到任何相关文档。
您至少可以使用 Windows.UI.Input.Preview.Injection
命名空间中的 类 和受限的 inputInjectionBrokered
功能来完成您正在寻找的部分内容。
这适用于 KeyUp
、KeyDown
、PreviewKeyUp
和 PreviewKeyDown
事件,只要您不需要向任何对象发送击键在您的应用程序之外。
Non-latin 脚本超出了我的工作范围,所以我不知道它是否可以扩展到会生成 TextComposition 事件的 IME。
Martin Zikmund 演示了这样做 here, with a sample solution available on github。
关键点是您需要编辑 Package.appxmanifest
文件(作为代码而不是通过设计器)以包括:
<Package>
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="rescap"
</Package>
和
<Capabilities>
<rescap:Capability Name="inputInjectionBrokered" />
<Capabilities>
从那里您可以通过以下方式模拟打字和引发本机键事件:
private async void TypeText()
{
Input.Focus(FocusState.Programmatic);
//we must yield the UI thread so that focus can be acquired
await Task.Delay(100);
InputInjector inputInjector = InputInjector.TryCreate();
foreach (var letter in "hello")
{
var info = new InjectedInputKeyboardInfo();
info.VirtualKey = (ushort)((VirtualKey)Enum.Parse(typeof(VirtualKey),
letter.ToString(), true));
inputInjector.InjectKeyboardInput(new[] { info });
//and generate the key up event next, doing it this way avoids
//the need for a delay like in Martin's sample code.
info.KeyOptions = InjectedInputKeyOptions.KeyUp;
inputInjector.InjectKeyboardInput(new[] { info });
}
}
我想在 UWP 中创建自定义屏幕键盘。它需要成为应用程序的一部分,因为它将用于大型 Table 或板设备,因此完全控制键盘位置非常重要(table 上的旋转)。
在 WPF 中,我已经通过创建带有目标 属性 的键盘控件来创建这样的自定义键盘。当按下一个键时,它会在目标上引发 KeyEvent 或 TextComposition UIElement.RaiseEvent(...)。 但是在UWP中,没有RaiseEvent函数,似乎没有办法为开发者引发路由事件。
我想使用本机文本事件(KeyDown 事件、TextComposition 事件等...),因此手动编辑 TextBox ( like this one ) 的文本 属性 的解决方案不被接受table.
This page 解释了如何创建一个监听 Text Services Framework 的控件。我认为一种解决方案是创建自定义文本服务,但我没有找到任何相关文档。
您至少可以使用 Windows.UI.Input.Preview.Injection
命名空间中的 类 和受限的 inputInjectionBrokered
功能来完成您正在寻找的部分内容。
这适用于 KeyUp
、KeyDown
、PreviewKeyUp
和 PreviewKeyDown
事件,只要您不需要向任何对象发送击键在您的应用程序之外。
Non-latin 脚本超出了我的工作范围,所以我不知道它是否可以扩展到会生成 TextComposition 事件的 IME。
Martin Zikmund 演示了这样做 here, with a sample solution available on github。
关键点是您需要编辑 Package.appxmanifest
文件(作为代码而不是通过设计器)以包括:
<Package>
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="rescap"
</Package>
和
<Capabilities>
<rescap:Capability Name="inputInjectionBrokered" />
<Capabilities>
从那里您可以通过以下方式模拟打字和引发本机键事件:
private async void TypeText()
{
Input.Focus(FocusState.Programmatic);
//we must yield the UI thread so that focus can be acquired
await Task.Delay(100);
InputInjector inputInjector = InputInjector.TryCreate();
foreach (var letter in "hello")
{
var info = new InjectedInputKeyboardInfo();
info.VirtualKey = (ushort)((VirtualKey)Enum.Parse(typeof(VirtualKey),
letter.ToString(), true));
inputInjector.InjectKeyboardInput(new[] { info });
//and generate the key up event next, doing it this way avoids
//the need for a delay like in Martin's sample code.
info.KeyOptions = InjectedInputKeyOptions.KeyUp;
inputInjector.InjectKeyboardInput(new[] { info });
}
}