次の方法で共有


Windows タッチ メッセージを使用したはじめに

このセクションでは、アプリケーションで Windows Touch 入力を機能させるために関連するタスクについて説明します。

次の手順は、通常、Windows Touch メッセージを操作するときに実行されます。

  1. 入力デジタイザーの機能をテストします。
  2. Windows Touch メッセージを受信するために登録します。
  3. メッセージを処理します。

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);
     ... ... ...
  }  
  

ウィンドウにタッチすると、ポップアップ ウィンドウからのタッチが示されます。

Windows タッチ入力