Windows 10 Pro上将WPF Classic Windows应用程序作为自定义外壳程序的OnScreen键盘问题

时间:2017-07-21 00:38:45

标签: c# wpf windows-10

我创建了一个WPF应用程序,在Windows 10上运行为自定义shell - Pro v.1607华硕TP 201平板电脑。

作为自定义shell的经典Windows应用无法在Windows 10 - Pro中定义。所以我修改了注册表以便为自定义用户分配自定义shell。

除了在TextBox上触发触摸事件后不弹出虚拟键盘这一事实外,应用程序运行良好。在我的开发机器上测试它工作正常,按预期提示键盘。甚至运行应用程序不是作为自定义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,我需要以管理员权限启动该过程,这样做,应用程序会提示需要管理员密钥的对话框,由于平板电脑用户没有这样做,所以无法完成拥有管理员权限。

3)安装了许可的自定义键盘,tabtipondemand,和2一样,需要管理密钥。

我想知道为什么要启动tabtip.exe,需要管理员级别。

 Process.Verb = "runas";

如果未使用admin启动,则虚拟键盘将失败,仅显示空白对话框。

所以我的问题是:

1)在运行为自定义shell的经典Windows WPF应用程序中,如何在没有管理员的情况下启动tabtip.exe,Windows 10本机屏幕键盘。

2)如何定义通用或动态路径以从Windows组件存储WinSxS启动osk.exe,而不是为每台计算机自定义每个路径。

3)我可以在我的应用程序中编译任何库,dll,以便在应用程序在Windows shell上运行时启用tabtip.exe的本机行为吗?

让我明白一下:

1)我正在运行Windows经典应用程序作为自定义shell,而不是UWA。

2)应用程序应作为自定义shell运行的计算机是Windows 10 - Pro v 1607,触摸屏,华硕tp201。

3)自定义shell未从任何应用商店或自助服务终端模式运行。由于许可复杂性,经典的Windows应用程序无法在Windows 10专业版上作为自定义外壳运行。

4)通过修改寄存器来配置自定义shell,工作正常,没有问题。

5)目前无法将我们的原生WPF应用程序迁移到UWA。有关于使用UWA定制外壳的som PITA。

1 个答案:

答案 0 :(得分:0)

我设法找到一个完美的解决方案,用于在Windows桌面应用程序中显示虚拟键盘的问题,该应用程序在Windows 10上作为自定义shell运行。

考虑到通过作为自定义shell运行Windows 10本机虚拟键盘不显示,我在Github上使用了一个名为 osklib <的 Alexei Sherbakov 共享的便利库/ strong>即可。它也可以在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);
    }
 }

这一切都快速简便且不失真。感谢阿列克谢。