次の方法で共有


アプリケーションのトラブルシューティング

このセクションでは、一般的な問題の解決策について説明します。

一般的なトラブルシューティング

カテゴリ 説明
問題点 Windows Server 2008 を実行していると Windows タッチ機能が動作しません。
原因 デスクトップ エクスペリエンスが有効になっていません。
解決策 サーバー マネージャー管理ツールを開きます。[開始] をクリックして [管理者ツール] をポイントし、[サーバー マネージャー] をクリックします。 左側の列の [機能] 項目をクリックします。 [機能] セクションで [機能の追加] をクリックします。 [デスクトップ エクスペリエンス] を選択し、[次へ] をクリックしてから [インストール] をクリックします。

 

カテゴリ 説明
問題点 アプリケーション上で指をすばやく動かすと、矢印が表示されてジェスチャーや操作が正しく登録されません。
原因 必要のないときにフリックが有効になっています。
解決策 無効にする場合は、フリックを有効にします。 ペン フリックを無効にする方法の詳細については、「スクロール バーを使用したパンのレガシ サポート」を参照してください。

 

問題点 マウス入力と Windows タッチ入力を区別できません。
原因 Windows では、ユーザーが画面をクリックすると、レガシ サポート用のマウス メッセージが生成されます。
解決策 WM_LBUTTONDOWN メッセージと WM_LBUTTONUP メッセージの GetMessageExtraInfo を呼び出すと、ソースを判断できます。 次のコードは、これを実行する方法を示しています。

C++
#define MOUSEEVENTF_FROMTOUCH 0xFF515700 

if ((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) { // Click was generated by wisptis / Windows Touch }else{ // Click was generated by the mouse. }

 

カテゴリ 説明
問題点 Windows 7 で Microsoft PixelSense アプリケーションを実行するには、どうすればよいですか?
原因 Windows タッチと Microsoft PixelSense には互換性がありません。
解決策 Windows 7 プラットフォームか Microsoft PixelSense プラットフォームのどちらかをターゲットにする必要があります。

 

操作と慣性のトラブルシューティング

カテゴリ 説明
問題点 アプリケーションが理由もなくフリーズしてしまいます。 オブジェクト インターフェイスを初期化するときにアクセス違反が発生します。
原因 IManipulationProcessor インターフェイスまたは IInertiaProcessor インターフェイスを使用するときに CoInitialize の呼び出しが欠落しています。
解決策 CoInitialize を呼び出さずに Windows タッチのコンポーネント オブジェクト モデル (COM) オブジェクトがインスタンス化されることが原因の可能性があります。 これは、ジェスチャの使用から操作または慣性インターフェイスの使用にプロジェクトを変換する場合に、発生することがあります。

 

カテゴリ 説明
問題点 オブジェクトが移動中に正しく回転しません。 1 本指での回転が正しく機能しません。
原因 オブジェクトでのピボットの設定が不適切です。
解決策 操作ピボット ポイントが正しく設定されていません。 PivotPointXプロパティと PivotPointY プロパティを、回転させるオブジェクトまたはポイントの中心に設定してから、PivotRadius プロパティをオブジェクトの半径に設定します。

 

Windows タッチ入力のトラブルシューティング

カテゴリ 説明
問題点 WM_TOUCH メッセージを処理した後、境界フィードバックが取得できなくなります。
原因 WM_TOUCH メッセージを処理せずに使用しています。
解決策 Windows タッチのメッセージを DefWindowProc に転送せずに使用すると、予期しない動作につながります。 WM_TOUCH メッセージを適切に処理する方法の詳細については、「Windows タッチのメッセージの概要」を参照してください。

 

問題点 windows.h が含まれているのに、"WM_TOUCH が定義されていません" と表示されます。
原因 Targetver.h の Windows バージョンが正しくありません。
解決策 正しい Windows バージョンがプロジェクトで設定されていません。 次のコードは、Windows 7 に正しく設定されている Windows タッチの Windows バージョンを示しています。
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

問題点 タッチ入力の x 座標と y 座標が無効のようです。 予想よりも大きい値か、負の値になります。
原因 タッチ ポイントをピクセルに変換する必要があるか、画面座標を変換する必要があるかもしれません。
解決策 TOUCH_COORD_TO_PIXELScreenToClient が呼び出されていることを確認してください。 この方法を次のコードに示します。
C++
      POINT ptInput;
      if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
        for (int i=0; i < static_cast<INT>(cInputs); i++){
          TOUCHINPUT ti = pInputs[i];                       
          if (ti.dwID != 0){                
            // Do something with your touch input handle.
            ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x);
            ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y);
            ScreenToClient(hWnd, &ptInput);
            points[ti.dwID][0] = ptInput.x;
            points[ti.dwID][1] = ptInput.y;
          }
        }
      }

:
ScreenToClient 関数を使用するには、アプリケーションの高 DPI サポートが必要です。 高 DPI のサポートの詳細については、「高 DPI」を参照してください。

 

 

カテゴリ 説明
問題点 WM_TOUCH メッセージは表示されませんが、WM_GESTURE メッセージが表示されるため、Windows タッチが動作しているようです。
原因 RegisterTouchWindow の呼び出しが欠落しています。
解決策 WM_TOUCH メッセージと WM_GESTURE メッセージは同時に表示できません。 RegisterTouchWindow を呼び出さない場合は、WM_GESTURE メッセージのみが受信されます。

 

カテゴリ 説明
問題点 指をタッチしてからアプリケーションに入力されるまでの間に、わずかな遅延があります。
原因 パーム リジェクションが入力遅延の原因です。
解決策 TWF_WANTPALMRegisterTouchWindow の呼び出しに設定されていると、パーム リジェクションが有効になります。 このため、入力が指、ペン、またはユーザーの手のひらで行われているかどうかをソフトウェアがテストする間に、小さな (100 ミリ秒) 遅延が発生します。 TWF_WANTPALM フラグがクリアされた状態で RegisterTouchWindow を呼び出し、パーム リジェクションを無効にします。

 

Windows タッチのジェスチャのトラブルシューティング

カテゴリ 説明
問題点 WM_GESTURE メッセージを処理した後、境界フィードバックが取得できなくなります。 つまり、以前動作していたジェスチャが機能しなくなりました。
原因 WM_GESTURE メッセージを処理せずに使用しています。
解決策 Windows タッチのメッセージを DefWindowProc に転送せずに使用すると、予期しない動作につながります。 WM_GESTURE を適切に処理する方法の詳細については、「Windows のジェスチャの概要」を参照してください。

 

カテゴリ 説明
問題点 WM_GESTURE メッセージは表示されませんが、WM_TOUCH メッセージが表示されるため、Windows タッチが動作しているようです。
原因 RegisterTouchWindow が呼び出されています。
解決策 WM_TOUCH メッセージと WM_GESTURE メッセージは同時に表示できません。 RegisterTouchWindow を呼び出すと、WM_GESTURE メッセージは受信されません。

 

問題点 期待していたジェスチャーが一部しか表示されません。 たとえば、識別子が GID_PAN のジェスチャは表示されますが、GID_ROTATE のジェスチャは表示されません。
原因 回転ジェスチャなどの一部のジェスチャは、既定では有効になっていません。
解決策 WM_GESTURENOTIFY リファレンスの説明どおりに、WM_GESTURENOTIFY メッセージを受信したときに SetGestureConfig を呼び出すか、WM_GESTURENOTIFY メッセージのハンドラーを追加する必要があります。 次のコードは、回転のサポートを有効にするためにハンドラーを実装する方法を示しています。

C++
// The message map. BEGIN_MESSAGE_MAP() ON_WM_CREATE() ... ... ... ON_MESSAGE(WM_GESTURENOTIFY, OnWindowsGestureNotify) END_MESSAGE_MAP() 

LRESULT CTestWndApp::OnWindowsGestureNotify( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ){ GESTURECONFIG gc; gc.dwID = GID_ROTATE; // The gesture identifier. gc.dwWant = GC_ROTATE; // The gesture command you are enabling for GID_ROTATE. gc.dwBlock = 0; // Don't block anything. UINT uiGcs = 1; // The number of gestures being set.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Something went wrong, report the error using your preferred logging. }

return 0; }

一般的なジェスチャ構成のその他の例については、SetGestureConfig を参照してください。

 

カテゴリ 説明
問題点 パン ジェスチャをしても、アプリケーションのカスタム スクロール バーがスクロールされません。
原因 正しい WM_*SCROLL メッセージのハンドラーが欠落しています。
解決策 カスタム スクロール バーでは、すべての WM_*SCROLL メッセージが処理されているわけではありません。 レガシ サポートを通じてカスタム スクロール バー機能を保持するのではなく、WM_GESTURE メッセージを処理することをお勧めします。 「スクロール バーを使用したパンのレガシ サポート」セクションで詳しく説明されているように、メッセージをサポートする必要があります。

 

カテゴリ 説明
問題点 ジェスチャーに遅延が発生しています。
原因 フリックがジェスチャの遅延を引き起こしている可能性があります。
解決策 フリックすると、アプリケーションで WM_GESTURE メッセージを受信するのに要する時間に遅延が発生する可能性があります。 フリックを無効にする方法の詳細については、「スクロール バーを使用したパンのレガシ サポート」を参照してください。

 

プログラミング ガイド