如何使Windows OSK在文本框聚焦时打开,而不是要求用户点击键盘图标



我们正在。net 4中开发一个与触摸屏一起使用的WPF应用程序。我们尝试使用内置的Windows OSK进行输入,最后剩下的问题是让键盘在文本框聚焦时立即打开。目前,如果一个文本框得到焦点,一个小键盘图标出现(这是InputPanel图标),用户必须点击该图标使键盘打开。

是否有一种方法可以跳过图标步骤,只是让键盘一直打开焦点?最好的东西,可以设置或编码在一个地方,并适用于所有的文本框全局?它还需要使用应用程序线程的当前区域性设置(它似乎已经在这样做了)。

我没能在控制面板设置中找到任何可以让你跳过图标步骤的东西。我还在网上找到了一些使用TextInputPanel的例子。但是当我在主窗口的预览焦点上实现打开TextInputPanel的代码时,我一直得到COM INTEROP异常,基本上进入了死胡同(Microsoft.Ink.dll是一个互操作DLL)。

是否有可能有一个注册表项,可以改变默认CurrentInPlaceState扩展而不是HoverTarget?我在网上找不到。

谢谢,

瓦莱丽

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 (regdbe_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放在我的应用程序文件夹中(如果这样可以工作的话?)我希望有一些简单的东西我错过了,因为这是很多麻烦,只是摆脱键盘提示…

任何帮助都非常感谢-当涉及到使用非托管/互操作程序集时,我有点新手…

我研究了一个类似的建议。在我的例子中,它是创建一个自定义OSK。似乎(到目前为止)不可能创建自定义输入设备。解释在这个链接中:http://social.msdn.microsoft.com/forums/en us/wpf/thread/a813a08a - 7960 - 45 - fe - bc91 e81cdb75bd10

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

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

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

的问候草

最新更新