2

我们正在开发一个将与触摸屏一起使用的 .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)。我找到了 Microsoft.Ink.dll 的 32 位版本,但我仍然遇到同样的错误,并且 Dependency Walker 也在说同样的事情 - GPSVC.dll 和 IESHIMS.dll 丢失。

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

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

4

1 回答 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),但我不确定它是否会产生相同的行为。

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

问候赫伯

于 2011-09-23T13:42:57.777 回答