さて、前回MFCでWM_TOUCHとGetTouchInputInfoを使ってタッチパネルの情報を取得したのだが、MFCよりはC#で書いた方が、あとでいろいろといじりやすい。
今回は、必要なAPIをインポートしてC#で同様の実装をしてみる。
Visual StudioでC#のフォームのスケルトンを作成する
名前は適当に付ける(ここでは"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にタッチパネルの情報が収納される。