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

さて前回うまくいかなかったタッチパネルの情報の取得、Windows 7からは新しくその名もWM_TOUCHというメッセージがある。
今回はこれを使ってTOUCHINPUTを取得してみる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317341(v=vs.85).aspx

Visual StudioMFCのダイアログベースのスケルトンを作成する

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

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

CMFCAhoDlg::OnInitDialog()に以下を追加する。

RegisterTouchWindow(1, 0);

これでこのダイアログがWM_TOUCHを受信できるようになる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317326(v=vs.85).aspx

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

Visual Studio 2015のMFCケルトンでは、WM_TOUCHのメッセージハンドラがデフォルトでは定義されていない。
ゆえにWindowProcをオーバーライドして、自分でメッセージハンドラーを実装する必要がある。
Class Wizardを開き、ダイアログのクラスを選択し、"Virtual Functions"から"WindowProc"を選び、ダイアログクラスに追加する。
こんな感じになっているはずだ。

LRESULT CMFCAhoDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: Add your specialized code here and/or call the base class

	return CDialogEx::WindowProc(message, wParam, lParam);
}

ここに、メッセージハンドラを追加する。

LRESULT CMFCApplication1Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: Add your specialized code here and/or call the base class
	switch (message)
	{
		case WM_TOUCH:
		{
			break;
		}
		default:
			break;
	}
	return CDialogEx::WindowProc(message, wParam, lParam);
}

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

こりだけ。

case WM_TOUCH:
{
	UINT cInputs = LOWORD(wParam);
	PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
	GetTouchInputInfo( (HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT) );
	// ここでTOUCHINPUTの処理をする
	delete[]pInputs;
	break;
}

TOUCHINPUT構造体の詳細は以下。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317334(v=vs.85).aspx

typedef struct _TOUCHINPUT {
  LONG      x;
  LONG      y;
  HANDLE    hSource;
  DWORD     dwID;
  DWORD     dwFlags;
  DWORD     dwMask;
  DWORD     dwTime;
  ULONG_PTR dwExtraInfo;
  DWORD     cxContact;
  DWORD     cyContact;
} TOUCHINPUT, *PTOUCHINPUT;

これで、タッチの座標(x, y)も、触ったか・動いたか・離したか(dwFlags)も取得できる。