我创建了一个 WPF 应用程序,它在 Windows 10 - Pro v. 1607 ASUS TP 201 平板电脑上作为自定义 shell 运行。
无法在 Windows 10 - Pro 中将经典 Windows 应用定义为自定义 shell。因此,我修改了注册表,以便为自定义用户分配自定义 shell。
应用程序运行良好,只是在文本框上触发触摸事件后虚拟键盘不会弹出。在我的开发机器上进行测试时,它工作正常,按预期提示键盘。即使不是将应用程序作为自定义 shell 运行,而是作为 Windows shell 之后的应用程序运行,也可以正常工作。仅当应用程序作为自定义 shell 运行时,屏幕键盘才会失效。
我尝试过在 Tocuh 事件后启动键盘可执行文件的方法:
private void launchKeyboard(object sender, RoutedEventArgs e)
{
Process.Start(@"C:\[Path]\osk.exe");
}
此事件由以下人员发起:
<Textbox x:Name="textbox" GotFocus="launchKeyboard" ... />
但是:
1) 要启动 osk.exe,需要从 WinSxS 组件存储启动可执行文件,因为 osk.exe 是在 64 位上运行的 32 位应用程序。需要注意的是,WinSxS 中的文件夹是用包含哈希值的长字符串命名的。因此,由于每个平板电脑都有一个自定义名称,因此我无法指定每个平板电脑的启动路径。
2) 要启动 tabtip.exe,我需要以管理员权限启动该进程,这样做时,应用程序会提示一个对话框,需要管理员 key ,但这是无法完成的,因为平板电脑用户没有具有管理员权限。
3) 安装了许可的自定义键盘 tabtipondemand,与 2 相同,需要管理 key 。
我想知道为什么要启动 tabtip.exe,需要管理员级别。
Process.Verb = "runas";
如果不使用管理员启动,则虚拟键盘将失败,仅出现空对话框。
所以我的问题是:
1) 如何在作为自定义 shell 运行的经典 Windows WPF 应用程序中启动 tabtip.exe(无需管理员的 Windows 10 native 屏幕键盘)。
2) 如何定义通用或动态路径来从 Windows 组件存储 WinSxS 启动 osk.exe,而不是为每台计算机自定义每个路径。
3) 我可以在我的应用程序中编译任何库、dll,以便当应用程序在 Windows shell 上运行时启用 tabtip.exe 的 native 行为吗?
让我澄清一下:
1) 我正在运行 Windows 经典应用程序作为自定义 shell,而不是 UWA。
2) 应用程序应作为自定义 shell 运行的计算机为 Windows 10 - Pro v 1607、触摸屏、Asus tp201。
3) 自定义 shell 未从任何应用商店或信息亭模式运行。由于许可复杂性,经典 Windows 应用无法在 Windows 10 专业版上作为自定义 shell 运行。
4)通过修改寄存器来配置自定义shell,工作正常,没有任何问题。
5) 目前无法将我们的 native WPF 应用程序迁移到 UWA。有一些关于使用 UWA 定制 shell 的 PITA。
最佳答案
我设法找到了一个完美的解决方案,解决在 Windows 桌面应用程序中显示虚拟键盘的问题,该应用程序在 Windows 10 上作为自定义 shell 运行。
考虑到作为自定义 shell 运行,Windows 10 native 虚拟键盘不会显示,我使用了 Alexei Sherbakov 在 Github 上共享的一个方便的库。称为osklib。它还可以作为 Nuget PM 中的包提供,可以在 VS 中使用。
添加 Osklib 作为对项目的引用,并使用 Gotfocus 事件从任何表单触发事件,该事件属于 System.Windows.Forms 命名空间:
<TextBox ... Gotfocus="TriggerKeyboard" />
然后创建调用 Osklib 类的 TriggerKeyboard 事件:
private void TriggerKeyboard(object sender, EventArgs e) {
try {
Osklib.OnScreenKeyboard.Show();
}
catch(Exception ex) {
MessageBox.Show(ex.Message);
}
}
这一切都快速、简单且不会失败。感谢阿列克谢。
关于c# - WPF 经典 Windows 应用程序作为 Windows 10 专业版上的自定义 Shell 时出现屏幕键盘问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45227217/