HOME >> Tips >> Microsoft.NET

Windows 8 環境でソフトウェアキーボードを出す → 消す

2013/12/11
文書番号:20190



タブレット端末で操作をしているとテキストボックスにフォーカスを受けたときにサッとソフトウェアキーボードが出てくることをイメージしていましたが... Windows 8 のタブレット端末で.NETアプリを実行しても出てきません。
iOS や Andoroid 端末では普通の動作のように感じるのですが…と思っていたら Windows ストアアプリでは出てくるようです。

毎度画面右下のキーボードボタンをタップして起動するのは面倒だと思っていたのですが、よく考えてみるとタッチ対応のディスプレイが接続されたデスクトップとか、タッチ対応のノートとかで常にソフトウェアキーボードが出てくるのはうざい...
やはり使う環境に合わせて出してあげた方がよさそうです。

そこで、.NETアプリからソフトウェアキーボードを起動する方法を調べてみました。


クリックで拡大


【サンプル】

  1. Imports に以下の2行を入れておきます。
    
      Imports System.Runtime.InteropServices
      Imports System.Diagnostics
    
    
  2. 変数定義とDLL参照を書きます。
    
      Const WM_SYSCOMMAND As Integer = &H112
      Const SC_CLOSE As Integer = &HF060
    
      <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
      Public Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr
      End Function
    
      <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
      Public Shared Function SendMessage(ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
      End Function
    
    
  3. ソフトウェアキーボードの起動と終了。
    
      ''' <summary>
      ''' ソフトウェアキーボードを起動
      ''' </summary>
      Private Sub OpenKeyboard()
          Process.Start("c:\program files\common files\microsoft shared\ink\tabtip.exe")
      End Sub
    
      ''' <summary>
      ''' ソフトウェアキーボードを終了
      ''' </summary>
      Private Sub CloseKeyboard()
    
          'ソフトウェアキーボードのウィンドウを探す
          Dim hWnd As IntPtr = FindWindow("IPTip_Main_Window", "")
    
          '見つけたら閉じるメッセージを送信
          If hWnd <> IntPtr.Zero Then
              Call SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0)
          End If
      End Sub
    
    
起動したキーボードのプロセスをKillしても終了することはできますが、そうすると次の起動に若干時間がかかるようになりました。完全に終了してしまう感じです。
CLOSEメッセージを送るとキーボードは閉じますが常駐のように起動していて、「tabtip.exe」の実行で隠れているキーボードを起動しているようです。


サンプルダウンロード
【参考情報】
こちらの情報を参考にさせていただきました。
ありがとうございます。
Windows8 デスクトップアプリでソフトキーボードを制御してみる