如何在Hololens 2 DirectX12应用程序中支持屏幕触摸键盘



我正在尝试将Hololens2集成到我们的自定义渲染引擎(Directx12 API(中。当我们的输入文本框处于活动状态时,我正在尝试显示Hololens触摸屏键盘。我看到了Microsoft文档,我们需要使用TextBoxControl从体积应用程序的视图切换到XAML 2D视图,以显示系统键盘并从中获取输入,然后返回到我们的主应用程序并将内容粘贴到我们的自定义InputTextBox中。这是展示Hololens触摸屏键盘的唯一方式吗?或者我们可以将触摸屏键盘显示在我们的体积应用程序场景本身上?我可以使用InputPane API和CoreTextEditContext API在我们的"体积"应用程序视图中显示Hololens2触摸屏键盘。但当我触摸屏幕键盘时,我无法获得按键事件。我已经实现了CoreWindow和CoreTextEditContext的所有事件回调,如KeyDown((、KeyUp((、TextUpdating((等。但这些回调没有被调用。我想,这是因为CoreWindow文本字段不在那里。。

如果你坚持在DirectX场景中使用系统键盘,我相信Rob Caplan在这个线程中提供的硬方法应该适用于你:在Windows Phone 8.1 Direct3D应用程序中打开软键盘。

简而言之,Windows使用UI Automation API来识别文本控件并与之交互。因此,您需要通过提供UI Automation文本模式和文本服务框架(TSF(接口,在DirectX中为自己的文本框UI控件实现TextPattern和焦点,然后当用户将焦点设置为键盘时,键盘将自动调用。

最后,我解决了在不使用单行xaml代码的情况下无法在全息视图中获得键盘事件的问题,现在我可以在全息视图显示屏幕触摸键盘,并且我可以在自己的自定义TextBox中获得文本输入。我从几天开始就在做它,我对UWP API一无所知。我挣扎了很多,在这里问了很多,但没有人能帮我解决我的问题,但今天我通过用xaml样本代码做实验得到了解决方案,所以如果有人也面临同样的问题,那么按照下面的实现

 CoreTextEditContext textEditContext = 
 CoreTextServicesManager.GetForCurrentView().CreateEditContext();
 textEditContext.TextUpdating += Context_TextUpdating;
        

以下两个事件回调必须实现才能在CoreWindow上获得按键事件,如CoreWindow.CharactReceived、CoreWindow.KeyDown、CoreWindows.KeyUp。我没有得到这些事件,因为我没有实施它们。

textEditContext.TextRequested += Context_TextRequested;
textEditContext.SelectionRequested += Context_SelectionRequested;

在这里,您告诉TextService,您将通过调用InputPane.TryShow和InputPane.TryHide API来显示和隐藏自己的键盘。

textEditContext.InputPaneDisplayPolicy = CoreTextInputPaneDisplayPolicy.Manual;
textEditContext.InputScope = CoreTextInputScope.Text;
        

获取屏幕键盘的实例并注册键盘隐藏和显示事件

InputPane OSDKeyboard = InputPane.GetForCurrentView();
OSDKeyboard.Showing += OSDKeyboard_Showing;
OSDKeyboard.Hiding += OSDKeyboard_Hiding;

CoreTextEditContext事件回调的实现。CoreWindow开始工作是因为以下功能,否则当我按下触摸键盘上的键时,我什么都没有得到

private void Context_SelectionRequested(CoreTextEditContext 
sender,CoreTextSelectionRequestedEventArgs args)
{
   var sel = new CoreTextRange();
   sel.StartCaretPosition = 0;
   sel.EndCaretPosition = 4;
   args.Request.Selection = sel;
}
private void Context_TextRequested(CoreTextEditContext sender, 
CoreTextTextRequestedEventArgs args)
{
    args.Request.Text = "Holographic_OnScreen_Keyboard";
}

现在您可以通过下面的代码行在屏幕键盘上显示。按下触摸键盘上的任意键,您将在CoreWindow.CharacterRecived和CoreWindow.KeyDown事件的注册回调中获得按键代码,您可以在hololens 2应用程序中进行文本输入。

textEditContext.NotifyFocusEnter();
OSDKeyboard.TryShow();

https://learn.microsoft.com/en-us/uwp/api/windows.ui.text.core.coretexteditcontext?view=winrt-19041

https://learn.microsoft.com/en-us/uwp/api/windows.ui.viewmanagement.inputpane?view=winrt-19041

最新更新