Windows タッチ メッセージを使用したはじめに
このセクションでは、アプリケーションで Windows Touch 入力を機能させるために関連するタスクについて説明します。
次の手順は、通常、Windows Touch メッセージを操作するときに実行されます。
- 入力デジタイザーの機能をテストします。
- Windows Touch メッセージを受信するために登録します。
- メッセージを処理します。
Windows Touch に使用されるメッセージは WM_TOUCH。 このメッセージは、デジタイザーとの接触のさまざまな状態を示します。
入力デジタイザーの機能をテストする
GetSystemMetrics 関数を使用すると、SM_DIGITIZER の nIndex 値を渡すことで、入力デジタイザーの機能に対してクエリを実行できます。 GetSystemMetrics は、デバイスの準備ができているかどうか、デバイスがペンまたはタッチをサポートしているかどうか、入力デバイスが統合されているか外部であるか、デバイスが複数の入力 (Windows Touch) をサポートしているかどうかを示すビット フィールドを返します。 次の表は、さまざまなフィールドのビットを示しています。
ビット | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
値 | スタックの準備完了 | 複数入力 | 予約済み | 予約済み | 外部ペン | 統合ペン | 外部タッチ | 統合タッチ |
特定の機能に対してコマンドの結果をテストするには、ビットごとの & 演算子と、テストする特定のビットを使用できます。 たとえば、Windows Touch をテストするには、7 番目のビットが設定されていることをテストします (16 進数で0x40)。 次のコード例は、これらの値をテストする方法を示しています。
#include <windows.h>
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value & NID_MULTI_INPUT){
/* digitizer is multitouch */
MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}
次の表は、入力デジタイザーのタッチ機能をテストするために windows.h で定義されている定数の一覧です。
Name | 値 | 説明 |
---|---|---|
TABLET_CONFIG_NONE | 0x00000000 | 入力デジタイザーにはタッチ機能がありません。 |
NID_INTEGRATED_TOUCH | 0x00000001 | 入力には統合タッチ デジタイザーが使用されます。 |
NID_EXTERNAL_TOUCH | 0x00000002 | 入力には外部タッチ デジタイザーが使用されます。 |
NID_INTEGRATED_PEN | 0x00000004 | 入力には、統合ペン デジタイザーが使用されます。 |
NID_EXTERNAL_PEN | 0x00000008 | 入力には外部ペン デジタイザーが使用されます。 |
NID_MULTI_INPUT | 0x00000040 | 入力には、複数の入力をサポートする入力デジタイザーが使用されます。 |
NID_READY | 0x00000080 | 入力デジタイザーは入力の準備ができています。 この値が設定されていない場合は、タブレット サービスが停止しているか、デジタイザーがサポートされていないか、デジタイザー ドライバーがインストールされていないことを意味する可能性があります。 |
NID_* 値を確認することは、タッチ、ペン、またはタブレット以外の入力用にアプリケーションを構成するユーザーのコンピューターの機能を確認する便利な方法です。 たとえば、動的ユーザー インターフェイス (UI) があり、その一部を自動的に構成する場合は、NID_INTEGRATED_TOUCH、NID_MULTITOUCHをチェックし、ユーザーが初めてアプリケーションを実行するときにタッチの最大数を取得できます。
注意
SM_GETSYSTEMMETRICSには固有の制限事項がいくつかあります。 たとえば、プラグ アンド プレイはサポートされません。 このため、この関数を永続的な構成の手段として使用する場合は注意が必要です。
Windows タッチ入力を受信するための登録
Windows Touch 入力を受信する前に、アプリケーションはまず Windows Touch 入力を受け取るために登録する必要があります。 アプリケーション ウィンドウを登録すると、アプリケーションはタッチ互換であることを示します。 アプリケーションがウィンドウを登録すると、ウィンドウで入力が行われると、Windows Touch ドライバーからの通知がアプリケーションに転送されます。 アプリケーションがシャットダウンすると、通知を無効にするためにウィンドウの登録が解除されます。
注意
WM_TOUCH メッセージは現在、"greedy" です。ウィンドウで最初のタッチ メッセージを受信すると、別のウィンドウがフォーカスを受け取るまで、すべてのタッチ メッセージがそのウィンドウに送信されます。
注意
既定では、 メッセージをWM_TOUCH するのではなく、 WM_GESTUREメッセージを 受信します。 RegisterTouchWindow を呼び出すと、WM_GESTUREメッセージの受信を停止します。
次のコードは、アプリケーションが Win32 アプリケーションで Windows Touch メッセージを受信するために登録する方法を示しています。
RegisterTouchWindow(hWnd, 0);
Windows タッチ メッセージの処理
Windows オペレーティング システムのアプリケーションからの Windows Touch メッセージは、さまざまな方法で処理できます。 GUI アプリケーションをプログラミングする場合は、目的のメッセージを処理するコードを WndProc
関数内に追加します。 Microsoft Foundation Class (MFC) またはマネージド アプリケーションをプログラミングする場合は、目的のメッセージのハンドラーを追加します。 次のコード例は、Windows ベースのアプリケーションで WndProc からタッチ メッセージを処理する方法を示しています。
LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam ){
BOOL bHandled = FALSE;
UINT cInputs = LOWORD(wParam);
PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
if (pInputs){
if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
for (UINT i=0; i < cInputs; i++){
TOUCHINPUT ti = pInputs[i];
//do something with each touch input entry
}
bHandled = TRUE;
}else{
/* handle the error here */
}
delete [] pInputs;
}else{
/* handle the error here, probably out of memory */
}
if (bHandled){
// if you handled the message, close the touch input handle and return
CloseTouchInputHandle((HTOUCHINPUT)lParam);
return 0;
}else{
// if you didn't handle the message, let DefWindowProc handle it
return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
// pass touch messages to the touch handler
case WM_TOUCH:
OnTouch(hWnd, wParam, lParam);
break;
次のコードは、メッセージ マップとメッセージ ハンドラーを実装する方法を示しています。 メッセージはメッセージ マップで宣言する必要があり、その後、メッセージのハンドラーを実装する必要があることに注意してください。 たとえば、MFC アプリケーションでは、ダイアログ コードでこれを宣言できます。 また、ダイアログ ウィンドウのOnInitDialog
関数には、 などの RegisterTouchWindow(m_hWnd, 0)
RegisterTouchWindow の呼び出しを含める必要があることにも注意してください。
// Class implementations within a dialog
LRESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam ){
//Insert handler code here to do something with the message or uncomment the following line to test
//MessageBox(L"touch!", L"touch!", MB_OK);
return 0;
}
// The message map
BEGIN_MESSAGE_MAP()
ON_WM_CREATE()
... ... ...
ON_MESSAGE(WM_TOUCH, OnTouch)
END_MESSAGE_MAP()
BOOL TestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
RegisterTouchWindow(m_hWnd, 0);
... ... ...
}
ウィンドウにタッチすると、ポップアップ ウィンドウからのタッチが示されます。
関連トピック