通过 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(

安卓Launcher之获取手机安装的应用列表,安卓launcher

Windows10 NT Shell ,使用 WPF Application 替换 Explorer.exe