首页 > 解决方案 > 通过 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 模式下工作而尝试应用的所有操作:

  1. 添加以下两个 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

  1. 我尝试按照此处所述应用 Nuget 包:

在 Windows 10 Pro 上使用 WPF 经典 Windows 应用程序作为自定义 Shell 时出现屏幕键盘问题

nuget包:

OSklib.Wpf

不工作。

  1. 我尝试按照此处所述应用 Nuget 包:

https://www.nuget.org/packages/WPFTabTip/

nuget包:

WPFT标签提示

不工作。

请注意,所有这 3 个都在常规的非 shell 模式下运行良好。


唯一对我有用的是尝试打开以下过程:

(Environment.GetFolderPath(Environment.SpecialFolder.System) + Path.DirectorySeparatorChar + "osk.exe");

这是在 shell 模式下唯一对我有用的东西,但这对我来说不是一个好的解决方案,因为它将键盘作为一个单独的窗口(在屏幕键盘上)打开,而不是作为我的 WPF 应用程序中的嵌入式键盘作为TabTip.exe 可以。

您的帮助将不胜感激,谢谢!

标签: c#wpfshellkeyboard

解决方案


显然,名为 TabTip 的浮动键盘的进程依赖于 Windows 的 Explorer.exe 进程,该进程在 shell 模式下不可用。

我最终实现了我自己的自定义虚拟键盘​​控件。

另一种选择是不使用 shell 模式,而只使用带有组策略的窗口(这对于锁定计算机、限制对特定文件夹、控制面板小程序和应用程序的访问很有用)。


推荐阅读