如何在TextBox获得焦点时如何打开Windows OSK,而不是要求用户点击键盘图标?

问题描述 投票:2回答:1

我们正在使用.NET 4中的WPF应用程序,该应用程序将与触摸屏一起使用。我们正在尝试使用内置的Windows OSK作为输入,最后剩下的问题是,一旦文本框获得焦点,便要打开键盘。当前,如果文本框获得焦点,则会出现一个小的键盘图标(这是InputPanel图标),用户必须点击该图标以使键盘打开。

是否有跳过图标步骤的方法,而只是将键盘一直打开就可以了?最好是可以在一处设置或编码并在全球范围内应用于所有文本框的内容?它还需要使用应用程序线程的当前区域性设置(它似乎已经在这样做)。

我无法在控制面板设置中找到任何可让您跳过图标步骤的内容。我还在网上找到了一些使用TextInputPanel.CurrentInPlaceState的示例,但是当我实现代码以在主窗口的预览焦点上打开TextInputPanel时,我不断收到COM INTEROP异常,基本上陷入了死胡同(Microsoft.Ink.dll是一个互操作的DLL)。

是否有可能将默认CurrentInPlaceState更改为Expanded而不是HoverTarget的注册表项?我一直无法在网上搜索中找到一个。

谢谢,

Valerie

EDIT:这是我放在主窗口代码后面的一些代码,以及我不断收到的异常消息-我不知道这意味着什么或如何解决(我的网络搜索失败我!)

protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
    {
        base.OnPreviewGotKeyboardFocus(e);

        TextBox textbox = e.NewFocus as TextBox;
        TextBox oldTextbox = e.OldFocus as TextBox;

        if (oldTextbox != null && boxesToInputs.ContainsKey(oldTextbox))
        {
            TextInputPanel oldPanel = boxesToInputs[oldTextbox];
            oldPanel.Dispose();
            boxesToInputs.Remove(oldTextbox);
        }

        if (textbox != null)
        {
            // Make sure we've cleaned up old panels, just in case
            if (boxesToInputs.ContainsKey(textbox))
            {
                boxesToInputs[textbox].Dispose();
                boxesToInputs.Remove(textbox);
            }

            TextInputPanel newPanel = new TextInputPanel(((HwndSource)PresentationSource.FromDependencyObject(textbox)).Handle);
            newPanel.DefaultInPlaceState = InPlaceState.Expanded;
            newPanel.DefaultInputArea = PanelInputArea.Keyboard;
            boxesToInputs[textbox] = newPanel;
        }
    }

这是异常消息,当我的代码调用TextInputPanel构造函数时会发生:

由于以下错误,为具有CLSID {F9B189D7-228B-4F2B-8650-B97F59E02C8C的组件检索COM类工厂失败:80040154未注册类(HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))

我已验证WPF应用程序的平台目标是x86。我运行了Dependency Walker,它说我正在使用的Microsoft.Ink.dll是64位,并且缺少两个延迟加载的依赖项(GPSVC.dll和IESHIMS.dll)。我找到了32位版本的Microsoft.Ink.dll,但是我仍然遇到相同的错误,Dependency Walker也在说同样的话-GPSVC.dll和IESHIMS.dll丢失了。

我不能以x64为目标,我希望不必将丢失的DLL放到我的应用程序文件夹中(如果可以的话?)。我希望我缺少一些简单的东西,因为要摆脱键盘提示会很麻烦...

非常感谢您的帮助-在处理非托管/互操作程序集时,我有点新手...

wpf textinput touchscreen on-screen-keyboard
1个回答
1
投票

我研究了类似的建议。就我而言,这是创建一个自定义OSK。到目前为止,似乎无法创建自定义输入设备。解释在此链接中:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/a813a08a-7960-45fe-bc91-e81cdb75bd10

此外,我找到了一个“解决方法”,该方法使用Win32 API调用来访问SendKey方法,并独立于目标报告输入。我发现的项目是:http://wosk.codeplex.com/

SendKey也可以在WinForms上使用(请参阅http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx,但是我不确定它是否会产生相同的行为。

接下来的几天我将检查这些选项,但也许其中一些信息可能会有所帮助。

关于赫伯


0
投票

请问有人仍然有此TipPopper的副本吗?我正在搜索它几个月,似乎没有人再拥有它。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.