c# - WPF 经典 Windows 应用程序作为 Windows 10 专业版上的自定义 Shell 时出现屏幕键盘问题

标签 c# wpf windows-10

我创建了一个 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 SherbakovGithub 上共享的一个方便的库。称为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/

相关文章:

c# - 在 For 循环内使用 IF 条件检查时如何丢弃数据表中的空值

c# - 有什么方法可以避免实现 ICommand 以在 MVVM 中使用 Button?

java - 在 Windows 10 上从命令行运行 java 程序

javascript - 如何在 Windows 通用应用程序中设置内容安全策略

Windows Defender - 以编程方式添加排除文件夹

c# - 如何确定允许调用特定方法的对象类型?

c# - 通用接口(interface)和扩展方法发现的多个实现

c# - ASP.NET MVC 中的递归

c# GetElementsByTagName 然后如何读取内部标签值

c# - 两个单独的 UserControls 似乎是同一个实例