【问题标题】:How to support On Screen Touch keyboard in Hololens 2 DirectX12 App如何在 Hololens 2 DirectX12 应用程序中支持屏幕触摸键盘
【发布时间】:2020-10-30 19:14:37
【问题描述】:

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

【问题讨论】:

    标签: uwp hololens


    【解决方案1】:

    如果你坚持在 DirectX 场景中使用系统键盘,我相信 Rob Caplan 在这个线程中提供的硬方法应该对你有用:Bringing up the soft keyboard in a Windows Phone 8.1 Direct3D app

    简而言之,Windows 使用 UI 自动化 API 来识别文本控件并与之交互。因此,您需要通过提供UI Automation text patternsText Service Framework (TSF) interfaces在DirectX中为您自己的文本框UI控件实现TextPattern和焦点,然后当用户设置焦点时键盘会自动调用。

    【讨论】:

    • 启用输入法编辑器 (IME) 时,应用程序不会收到此事件。输入法编辑器 (IME) 处理所有键盘输入并将 Handled 设置为 true。 Hololens 默认启用英语输入法,您不能禁用它。这就是 CoreWindow.CharacterReceived 不起作用的原因。只剩下一种方法是实现 UI 自动化文本模式和文本服务框架 (TSF) 接口,但 Mircosoft 没有给出任何示例,因此我可以清楚地了解实现 UI 自动化文本模式和文本服务框架 (TSF) 接口.
    【解决方案2】:

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

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

    必须实现以下两个事件回调才能在您的 CoreWindow 上获取按键事件,例如 CoreWindow.CharacterReceived、CoreWindow.KeyDown、CoreWindow.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.CharacterRecieved 和 CoreWindow.KeyDown 回调中获得按下的键代码。从那里您可以在 hololens 2 应用程序中进行文本输入。

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2015-04-13
      • 2011-03-11
      • 1970-01-01
      • 2011-11-27
      相关资源
      最近更新 更多