やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

(WPF)タッチキーボードを表示する

Windows10 + WPF でTextBox を選択したときにタッチキーボードが表示されない現象についてハマったのでメモ

動作環境

タッチキーボードが表示されない

通常、Windows10 環境であれば入力領域を選択するとタッチキーボードが表示されます。
しかし、動作環境のタブレットでTextBox を選択してもタッチキーボードが表示されないケースがありました。
この現象が発生したのがASUS R105H という2 in 1 タブレットです。
また、このタブレットで"タブレットモードOFF" にするとタッチキーボードが表示されなくなります。
"タブレットモードON" だとタッチキーボードは表示されます。
対象のコントロールはTextBox とPasswordBox です。

原因

いろいろ調査した結果、以下の設定が原因のようでした。
[Windows の設定] - [デバイス] - [入力] から以下の設定が OFF だと、この現象が発生します。(Windows10 1709 ではこのメニューでした)
f:id:iyemon018:20181019184434p:plain

複数の端末を確認したところ、

  • デスクトップはデフォルトOFF
  • キーボード付きタブレットはデフォルトOFF
  • キーボードなしタブレットはデフォルトON

のようです。
ただし、OS バージョンや環境によっては設定が変わっている場合もあります。

対策

単純に「タブレットモードON にする」「上記の設定をON にする」であれば回避可能です。
ただし、不特定多数の端末にアプリをインストールする必要がある場合はアプリ側で回避する必要があります。
実際には以下の手順を実行します。

  1. レジストリエディタからタッチキーボードをON にする。
    HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7\EnableDesktopModeAutoInvoke を 1 にする。
  2. タッチキーボードのプロセスを実行する。
    タッチキーボードのプロセスは"C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe"

具体的なコード

namespace KeyboardTest
{
    using System.Diagnostics;
    using System.Windows;
    using Microsoft.Win32;

    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void UIElement_OnGotFocus(object sender, RoutedEventArgs e)
        {
            // レジストリの値が 1 であればタッチキーボードは ON になっている。
            int value = (int)(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7", "EnableDesktopModeAutoInvoke", -1) ?? -1);
            if (value != 1)
            {
                Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7", "EnableDesktopModeAutoInvoke", 1);
            }

            Process.Start(@"C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe");
        }
    }
}

ただし、デスクトップなどでUSB により物理キーボードを接続している場合はタッチキーボードが表示されますが、2 in 1 タブレットなど予めキーボードが付属しているものはタッチキーボードが表示されません。

これらのレジストリやプロセスは今後のWindows Update によって変更になる or 使用できなくなる可能性が充分あるため、もう少しスマートな回避策がほしいところですが、私の調べた限りではこれ以上の情報がありませんでした…。

ちなみに、以下のページで.NET Framework 4.6.2 にアップデートするとタッチキーボードが自動で表示できるようになるよ という情報を見ましたが、実際にはそのように動作しませんでした。
環境によるのでしょうか?

blog.mzikmund.com

このあたりの情報をお持ちの方がいらっしゃいましたら教えてくださいm( )m