プログラミングで世界を変える

ゲームプログラミングと技術のこと

UnityでWindowsデスクトップアプリの仮想キーボードを呼び出すdll

UnityでWindowsデスクトップアプリを作る際に、タブレットなどで必要になる仮想キーボードが表示されない問題がありました。そこでUnity上から仮想キーボードを呼び出すdllを作成しました。

ダウンロード

http://unubore.egoism.jp/techblog/distribution/WindowsTouchScreenKeyboard/UnityKeyboard.dll

使い方

Assets/Pluginsフォルダ以下にダウンロードしたdllをインポートします。

ちなみに複数のプラットフォームに対応する場合は、インスペクターかサブディレクトを用いて適用先を設定することも可能です。 docs.unity3d.com

あとはusingしてメソッドを呼び出せばokです。以下のスクリプトを参考にしてください。

このスクリプトをシーン上の適当なオブジェクトにアタッチすれば自動的にハンドリングされると思いますが、動作確認はしていません。 gist.github.com

作成までの話

背景

現在のWindows向けのアプリではUWP(Universal Windows Platform)の使用が推奨されており、これによってWSA(Windows Store App, スタート画面でタイル表示され、全画面で起動するようなアプリ)を作成することができます。

Windowsでは互換性のためUWP以前のアプリケーション(デスクトップアプリ)も動作するのですが、Windowsタブレットなど物理キーボードがない端末の場合には仮想キーボード(タッチキーボード)を表示する必要があります。これはUnityでいうWindows向けのStandaloneアプリに該当します。

ここで問題があり、デスクトップアプリの場合は仮想キーボードが想定されていないため、呼び出すためのAPIなどが用意されていません。WFPやWindowsフォームの場合は自動的にハンドリングしてくれる場合もあるのですが、UnityのInputFieldのような環境では手動で呼び出す必要がありました。

言葉の定義などはちょまどさんの記事が参考になるかと思います。 blogs.msdn.microsoft.com

ちなみにWSAに関してはUnityからの操作がサポートされています。 docs.unity3d.com

実装

以下のコードをVisualStudio上でdllとしてビルドしてやれば、記事の先頭にあるdllと同じものができるはずです。

gist.github.com

こちらのページを参考にしています。 www.projectgroup.info

また、このメソッドをdll化してUnity上で使用できるようにする方法は、こちらのページを参考にしました。 qiita.com

余談

ちなみに以下のページを参考にしてプロセスをKill()する方法も検討しましたが、Unityでは使用できませんでした。

loosekizuna.blog108.fc2.com

というのも、MonoではProcessを取得できない場合があり、キーボードに関連しているプロセスを特定することが困難でした。そのため今回はWin32APIのメソッドを使用しています。

gamedev.stackexchange.com