首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows10Pro上WPF经典Windows作为自定义外壳的OnScreen键盘问题

Windows10Pro上WPF经典Windows作为自定义外壳的OnScreen键盘问题
EN

Stack Overflow用户
提问于 2017-07-21 00:38:44
回答 1查看 1.1K关注 0票数 2

我已经创建了一个WPF应用程序,它在Windows10-Pro v. 1607 ASUS TP 201平板电脑上作为自定义外壳运行。

经典的windows应用程序作为自定义shell不能在Windows10-Pro中定义。因此,我修改了注册表,以便为自定义用户分配一个自定义shell。

应用程序运行良好,除非在TextBoxes上触发触摸事件后,虚拟键盘不会弹出。在我的开发机器上进行测试时,它可以正常工作,并按预期提示键盘。即使是运行应用程序,而不是自定义的shell,作为一个应用程序后的windows,工作良好。只有当应用程序以自定义外壳的形式运行时,屏幕上的键盘才会失败。

我尝试过在Tocuh之后启动键盘可执行文件的方法:

代码语言:javascript
复制
private void launchKeyboard(object sender, RoutedEventArgs e) 
{
   Process.Start(@"C:\[Path]\osk.exe");
}

此活动由下列人员发起:

代码语言:javascript
复制
<Textbox x:Name="textbox" GotFocus="launchKeyboard" ... />

然而:

1)要启动osk.exe,需要从WinSxS组件存储库中读取可执行文件,因为osk.exe是一个运行在64位上的32位应用程序。请注意,WinSxS中的文件夹是用包含散列的长字符串命名的。因此,我不能为每个平板电脑指定启动路径,因为每个平板都有一个自定义名称。

2)要启动tabtip.exe,我需要启动具有管理员权限的进程,这样,应用程序就会提示一个需要管理键的对话框,这是无法完成的,因为平板电脑用户没有管理权限。

3)安装了许可的自定义键盘tabtipondemand (与2相同)需要管理键。

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

代码语言:javascript
复制
 Process.Verb = "runas";

如果不使用admin启动,则虚拟键盘失败,只会出现空对话框。

所以我的问题是:

1)如何在一个运行自定义外壳的经典windows应用程序中,在没有管理员的情况下启动windows 10本机键盘tabtip.exe。

2)如何定义一个通用的或动态的路径来从启动WinSxS,而不是为每台机器定制每个路径。

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

让我澄清这一点:

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

2)应用程序应该作为自定义外壳运行的机器是Windows10-Prov 1607,触摸屏,华硕tp201。

3)自定义shell不运行于任何应用程序商店或kiosk模式。由于许可证的复杂性,一个经典的windows应用程序不能在Windows 10 pro上作为自定义shell运行。

4)定制shell是通过修改寄存器来配置的,该寄存器工作正常,没有任何问题。

5)目前还不可能将我们的本地WPF应用程序迁移到UWA。与UWA一起定制外壳上有som。

EN

回答 1

Stack Overflow用户

发布于 2017-12-13 01:12:47

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

考虑到通过作为自定义shell运行Windows 10本机虚拟键盘不显示,我使用了Alexei SherbakovGithub上共享的一个名为osklib的方便的库。它也可以作为一个软件包在Nuget,准备在VS中使用。

添加Osklib作为对项目的引用,并使用属于System.Windows.Forms命名空间的任何形式的Gotfocus事件触发事件:

代码语言:javascript
复制
<TextBox ... Gotfocus="TriggerKeyboard" />

然后创建调用Osklib类的TriggerKeyboard事件:

代码语言:javascript
复制
private void TriggerKeyboard(object sender, EventArgs e) {
     try {
        Osklib.OnScreenKeyboard.Show();
     } 
    catch(Exception ex) {
       MessageBox.Show(ex.Message);
    }
 }

这一切都是快速的,容易的和失败的。多亏阿列克谢。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45227217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档