c# - 通过 Shell Launcher 运行 WPF 应用程序时,触摸输入字段时无法打开浮动键盘
问题描述
我开发了一个 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 文件时才会出现此问题。当我这样做时,当我触摸输入文本框时不会出现浮动键盘(在常规非 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 包:
在 Windows 10 Pro 上使用 WPF 经典 Windows 应用程序作为自定义 Shell 时出现屏幕键盘问题
nuget包:
OSklib.Wpf
不工作。
- 我尝试按照此处所述应用 Nuget 包:
https://www.nuget.org/packages/WPFTabTip/
nuget包:
WPFT标签提示
不工作。
请注意,所有这 3 个都在常规的非 shell 模式下运行良好。
唯一对我有用的是尝试打开以下过程:
(Environment.GetFolderPath(Environment.SpecialFolder.System) + Path.DirectorySeparatorChar + "osk.exe");
这是在 shell 模式下唯一对我有用的东西,但这对我来说不是一个好的解决方案,因为它将键盘作为一个单独的窗口(在屏幕键盘上)打开,而不是作为我的 WPF 应用程序中的嵌入式键盘作为TabTip.exe 可以。
您的帮助将不胜感激,谢谢!
解决方案
显然,名为 TabTip 的浮动键盘的进程依赖于 Windows 的 Explorer.exe 进程,该进程在 shell 模式下不可用。
我最终实现了我自己的自定义虚拟键盘控件。
另一种选择是不使用 shell 模式,而只使用带有组策略的窗口(这对于锁定计算机、限制对特定文件夹、控制面板小程序和应用程序的访问很有用)。
推荐阅读
- python-3.x - 如何仅从字符串文本中提取名称
- powershell - PowerShell Format-Table 需要属性作为列标题
- java - Why does this code NOT throw a ConcurrentModificationException?
- angularjs - 我想清除输入数据,然后显示空输入数据
- visual-studio - 为什么 Visual Studio 2019 在剪切和粘贴 F# 代码时会删除我的缩进?
- c++ - 请告知如何重写
- python - 如何正确指定 Keras LSTM 模型的输入形状
- c - 如何从 Matlab C API 调用 engClose() 并等待其进程关闭?
- function - 创建函数错误错误:在“$$”处或附近未终止的美元引号字符串
- javascript - 是否可以通过画布合并两张响应式照片?