UWP中的自定义应用程序键盘

时间:2016-08-11 14:27:32

标签: c# uwp windows-10-universal uwp-xaml

我想在UWP中创建自定义OnScreen键盘。它需要成为应用程序的一部分,因为它将用于大型表或板设备,因此完全控制键盘位置非常重要(在桌面上旋转)。

在WPF中,我已经通过创建一个具有Target属性的键盘控件来制作这样的自定义键盘。按下某个键时,它会使用 UIElement.RaiseEvent(...)在目标上引发KeyEvent或TextComposition。 但是在UWP中,没有RaiseEvent函数,似乎没有办法为开发者引发路由事件。

我想使用本机文本事件(KeyDown事件,TextComposition事件等),因此不能接受手动编辑TextBox(like this one)的Text属性的解决方案。

This page说明了如何创建一个听 Text Services Framework 的控件。我认为一个解决方案是创建一个自定义文本服务,但我没有找到任何关于此的文档。

1 个答案:

答案 0 :(得分:1)

您可以使用Windows.UI.Input.Preview.Injection命名空间中的类和受限制的inputInjectionBrokered功能,至少完成您要查找的部分内容。

这适用于KeyUpKeyDownPreviewKeyUpPreviewKeyDown事件,只要您不需要向任何事情发送击键在您的应用之外。

非拉丁文脚本超出了我的工作范围,因此我不知道是否可以将其扩展到可生成TextComposition事件的IME。

Martin Zikmund演示了这样做here,并在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 });
    }
}