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

时间:2011-09-22 16:16:14

标签: wpf textinput touchscreen on-screen-keyboard

我们正在研究.NET 4中将与触摸屏一起使用的WPF应用程序。我们正在尝试使用内置的Windows OSK进行输入,最后一个问题是在文本框获得焦点后立即打开键盘。目前,如果文本框获得焦点,则会出现一个小键盘图标(这是InputPanel图标),用户必须点击该图标才能打开键盘。

有没有办法跳过图标步骤,只需让键盘一直打开焦点?最好能在一个地方设置或编码并全局应用于所有文本框的东西?它还需要使用应用程序线程的当前文化设置(它似乎已经在进行)。

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

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

谢谢,

瓦莱丽

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

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放入我的应用程序文件夹(如果这样可行吗?)。我希望有一些简单的东西,我错过了,因为这是一个很大的麻烦,只是摆脱键盘提示......

非常感谢任何帮助 - 在使用非托管/互操作程序集时,我有点新手......

1 个答案:

答案 0 :(得分:1)

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

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

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

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

此致 数量锐减