通过 Shell Launcher 运行 WPF 应用程序时,触摸输入字段时无法打开浮动键盘
Posted
技术标签:
【中文标题】通过 Shell Launcher 运行 WPF 应用程序时,触摸输入字段时无法打开浮动键盘【英文标题】:Can't open a floating keyboard upon touch of input fields while running a WPF app via Shell Launcher 【发布时间】:2018-05-28 08:31:22 【问题描述】:我开发的 WPF 应用程序必须支持触摸(包括在触摸输入字段(如文本框)时出现的浮动键盘),并且还必须支持在 shell 模式下运行我的 WPF 应用程序 exe 文件。
我在 shell 模式下运行我的 WPF 应用程序 exe 文件,如下所示:
我通过触摸打开浮动键盘的代码如下:
txtUserName.TouchUp += ShowKeyboard;
txtUserName.LostFocus += CloseKeyboardProcess;
这两种方法的实现如下:
private void ShowKeyboard(object sender, RoutedEventArgs e)
var touchKeyboardPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles) +
@"\Microsoft Shared\ink\TabTip.exe";
_keyProccesl = Process.Start(touchKeyboardPath);
[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
private void CloseKeyboardProcess(object sender, RoutedEventArgs e)
try
var iHandle = FindWindow("IPTIP_Main_Window", "");
if (iHandle > 0)
SendMessage(iHandle, 0x0112, 0xF060, 0);
catch (Exception ex)
Logger.WriteErr(LogCode.WIN_KEYBOARD_CLOSE_FAILED, ex);
_keyProcess1 只是该类的私有成员:
private Process _keyProccesl;
现在,让我描述一下我遇到的问题:
当我在常规模式下运行我的 WPF 应用程序时(不是如上所述的 shell 模式),一切正常:当我触摸文本框时,会出现浮动键盘。当我离开文本框(失去焦点)时,浮动键盘确实关闭了。
当我在 shell 模式下运行我的 WPF 应用程序 exe 文件时,仅会出现此问题。 当我这样做时,当我触摸输入文本框时会出现 NO 浮动键盘(在常规非 shell 模式下完美运行的相同操作)。
现在让我描述一下我为使其在 shell 模式下工作而尝试应用的所有操作:
-
添加以下两个 reg 条目并不能解决问题:
HKCU\Software\Microsoft\TabletTip\1.7\EnableDesktopModeAutoInvoke = 1
HKCU\Software\Microsoft\windows\CurrentVersion\ImmersiveShell\TabletMode = 1
另外,不是这些:
HKLM\Software\Microsoft\TabletTip\1.7\EnableDesktopModeAutoInvoke = 1 HKLM\Software\Microsoft\windows\CurrentVersion\ImmersiveShell\TabletMode = 1
-
我已尝试按照此处所述应用 Nuget 包:
OnScreen keyboard issue with WPF Classic Windows App as Custom Shell on Windows 10 Pro
nuget 包:
Osklib.Wpf
没用。
-
我已尝试按照此处所述应用 Nuget 包:
https://www.nuget.org/packages/WPFTabTip/
nuget 包:
WPFTab 提示
没用。
请注意,所有这 3 个都在常规的非 shell 模式下运行良好。
唯一对我有用的是尝试打开以下进程:
(Environment.GetFolderPath(Environment.SpecialFolder.System) + Path.DirectorySeparatorChar + "osk.exe");
这是在 shell 模式下唯一对我有用的东西,但这对我来说不是一个好的解决方案,因为它将键盘作为一个单独的窗口(在屏幕键盘上)打开,而不是作为我的 WPF 中的嵌入式键盘就像 TabTip.exe 一样。
非常感谢您的帮助,谢谢!
【问题讨论】:
【参考方案1】:显然,浮动键盘的进程,名为TabTip,依赖于Windows的Explorer.exe进程,在shell模式下是不可用的。
我最终实现了我自己的自定义虚拟键盘控件。
另一个选项是不使用 shell 模式,而只使用带有组策略的窗口(这对于锁定计算机、限制对特定文件夹、控制面板小程序和应用程序的访问很有用)。
【讨论】:
以上是关于通过 Shell Launcher 运行 WPF 应用程序时,触摸输入字段时无法打开浮动键盘的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Windows 10 Enterprise Shell Launcher 出现黑屏?
.gif 图像作为源代码在 Windows kivy 程序中运行良好。通过 kivy Launcher 运行显示 gif 图像的背景
微端游戏启动器LAUNCHER的制作之MFC版一(序和进程通信)
$ adb shell am start -n “com.***“ -a android.intent.action.MAIN -c android.intent.category.LAUNCHER(