我们正在开发一个将与触摸屏一起使用的 .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 放入我的应用程序文件夹中(如果这样可行?)。我希望我缺少一些简单的东西,因为摆脱键盘提示很麻烦......
非常感谢任何帮助 - 在使用非托管/互操作程序集时,我有点新手......