HID情報を入手する - C#でTOUCHINPUTを使う

さて、前回MFCでWM_TOUCHとGetTouchInputInfoを使ってタッチパネルの情報を取得したのだが、MFCよりはC#で書いた方が、あとでいろいろといじりやすい。
今回は、必要なAPIをインポートしてC#で同様の実装をしてみる。

Visual StudioC#のフォームのスケルトンを作成する

名前は適当に付ける(ここでは"FormAho")。

必要なAPIをインポートする

Formのクラスに以下のように追記して、RegisterTouchWindowとGetTouchInputInfoをインポートする。

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool RegisterTouchWindow(IntPtr hWnd, uint ulFlags);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [In, Out] TOUCHINPUT[] pInputs, int cbSize);

必要な構造体などを追加する

同様にFormクラスに以下のように追記して、TOUCHINPUT構造体とWM_TOUCHのIDを宣言する。

private struct TOUCHINPUT
{
    public int x;
    public int y;
    public System.IntPtr hSource;
    public int dwID;
    public int dwFlags;
    public int dwMask;
    public int dwTime;
    public System.IntPtr dwExtraInfo;
    public int cxContact;
    public int cyContact;
}
private const int WM_TOUCH = 0x0240;

ウィンドウをタッチ対応として登録する

FormのLoadイベントハンドラーを以下のように実装する。

private void onFormLoad(object sender, EventArgs e)
{
    bool result = RegisterTouchWindow(this.Handle, 0);
}

これでこのformがWM_TOUCHを受信できるようになる。

WM_TOUCHのメッセージハンドラーを実装する

FormのWndProcをオーバーライドして、WM_TOUCHのメッセージハンドラを実装する。
こんな感じだ。

protected override void WndProc(ref Message m)
{
   switch (m.Msg)
   {
       case WM_TOUCH:
           break;
       default:
           break;
   }
   base.WndProc(ref m);
}

WM_TOUCHのイベントハンドラを実装する

こりだけ。

protected override void WndProc(ref Message m)
{
   switch (m.Msg)
   {
       case WM_TOUCH:
           int inputCount = (int)(m.WParam.ToInt32() & 0xFFFF);
           TOUCHINPUT[] inputs = new TOUCHINPUT[inputCount];
           bool result = GetTouchInputInfo(m.LParam, inputCount, inputs, Marshal.SizeOf(inputs[0]));
           printTOUCHINPUT(inputs[0]);
           break;
       default:
           break;
   }
   base.WndProc(ref m);
}

これで、inputsにタッチパネルの情報が収納される。