タブレットやタッチパネルが普及して、ちょいちょい手書き入力の要望が増えてきました。
今日は.Netで手書きコントロールを使用する方法のまとめです。
Windows 10には、タッチキーボードという手書き入力のコントロールが標準で用意されています。
プログラムからはそれを呼び出すだけなので、比較的楽に実装できます。
こんなの↓
見た目も良いので、対象OSがWindows 10以降であればタッチキーボードが良いでしょう。
それでは実際のソースを載せます。例の如く自己責任で!
タッチキーボードのEXE(TabTip.exe)のパスは環境によって異ります。
Form1.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace HandwritingExample
{
public partial class Form1 : Form
{
private const string TABTIP = @"C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe";
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_CLOSE = 0xF060;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(int hWnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
public Form1()
{
InitializeComponent();
}
private void textBox1_Enter(object sender, EventArgs e)
{
Process.Start(TABTIP);
}
private void textBox1_Leave(object sender, EventArgs e)
{
int handle = FindWindow("IPTIP_Main_Window", "");
if (handle > 0)
{
SendMessage(handle, WM_SYSCOMMAND, SC_CLOSE, 0);
}
}
}
}
簡単に補足すると、
TextBoxのEnterでタッチキーボードを表示、Leaveで非表示にしています。
表示する際は、Process.Startで立ち上げれば、複数立ち上がることなく良しなにやってくれます。
非表示にする際は、ProcessのKillやCloseではだめで、TabTip.exeのメインウィンドウに対してSendMessageする必要があります。
画面はこんな感じ↓
「Windows 10 Anniversary Update」後にタッチキーボードのEXE(TabTip.exe)が起動しない不具合が起きているようです。EXEを直接実行して何も表示されないようであれば要対策です。
実際にぼくの環境でもプロセスは立ち上がるが、タッチキーボードが表示されませんでした。
以下、対処法。
①レジストリディターで下記の階層を開きます。
HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7
②右ペインで右クリック
↓
新規
↓
DWORD(32bit)値
を選択します。
③追加した項目の名前を、
「EnableDesktopModeAutoInvoke」に変更して、値を「1」に設定します。
④レジストリエディターを閉じ、直接EXEをダブルクリックして、下記のWindowが表示されれば成功です。
Visual Studio上でInkEditは標準の状態では使用できません。
しかしDLL自体はProgram Filesに格納されているので、それを使える状態にします。
①Visual Studioのツールボックスで右クリック
↓
アイテムの選択
②「.Net Framework コンポーネント」タブが表示されます。
リストにはないので、「参照」ボタンをクリック。
③「Microsoft.Ink.dll」を選択します。
ぼくの環境では↓の階層にありました。
C:\Program Files (x86)\Common Files\microsoft shared\Ink
④追加すると、↓の2つのコントロールが選択状態になるので、そのままOKを選択
これで使える状態になります。
ツールボックス上で「InkEdit」が追加されているので、選択してForm上に配置します。
デフォルトではマウスによる入力を受け付けていないので、
追加したInkEditコントロールのプロパティ「UseMouseForInput」の値を「True」に変更します。
実際に入力してみます。
汚い字でも認識してくれました。
InkEditも準備さえすれば、簡単に使えますね。
ただInkEditはTextBoxルックなコントロールなので、タブレット等で表示するには装飾が必要かもしれません。
以上、.Netで使用する手書き入力まとめでした。