2013-01-12 90 views
8

ユーザーが画面に触れると自分自身を表示するアプリを作りたいと思います。クリックのためには機能しません。私はWindows 7/8でタッチハンナーを探しました。 DRマウスクリックではなく、タッピング(タッチ入力)をグローバルに検出する方法は?

は(世界的に)私の窓の外のタッチポイントの位置を取得する方法はあります。しかし、私は、すべてのタッチウィンドウがRegisterTouchWindow

TLに登録しなければならないことを見ましたか?

答えて

9

RegisterTouchWindowはWin 8アプリでは不要です。

私が知る限り、あなたの目的を達成するにはいくつかの制限があります。

  1. This article here勝利7 & 8の両方で動作しますが、ベンダーIDとタッチスクリーンのプロダクトIDが必要です。一部のタッチデバイスでアプリケーションが正しく動作しない可能性があります。

  2. Win 8にRegisterPointerInputTargetを使用してください。私のデバッグから、Windows 8タッチメカニズムはその独特の特徴を持っています。タッチダウンとタッチアップとの間に、すべてのタッチイベントが、最初のタッチイベントを受け取ったウィンドウに送信されます。ウィンドウが最小化されるか、別のウィンドウで覆われても、後の期間にWS_EX_TRANSPARENT属性が設定されます。 1回の押下と解除との間のタッチイベントは、最初のウィンドウが破棄された場合にのみ、別のウィンドウと共有することができます。このAPIを使用すると、すべてのタッチイベントが登録済みのウィンドウに送信されます。登録されたウィンドウによってUnregisterPointerInputTargetが呼び出されるか、InjectTouchInputを使用してタッチ入力がシステムに戻されるまで、他のウィンドウはタッチイベントを受信できなくなります。 "登録された入力ターゲットによって注入された入力は傍受されません。"このAPIを使用するにはUIアクセス権限が必要です。サンプルはhereにあります。

  3. Windowsフック。 Win 7/8のデスクトップアプリケーションの場合、タッチイベントは、SetWindowsHookExをWH_CALLWNDPROCまたはWH_GETMESSAGEと組み合わせて簡単にフックできます。 Win 8のメトロアプリでは、ウィンドウのメッセージループで最初のポインタイベントのみが検出されます。ポインターイベントは、クリックまたはタップで発生する可能性がありますが、GetPointerTypeはタッチポインターかマウスポインターかを教えてくれます。フックを使用するサンプルはhereにあります。

ポインタイベントを処理するためのコードスニペット:助けるため

switch(Msg) 
{ 
... 
case WM_POINTERENTER: 
case WM_NCPOINTERDOWN: 
case WM_NCPOINTERUP: 
case WM_NCPOINTERUPDATE: 
case WM_POINTERACTIVATE: 
case WM_POINTERCAPTURECHANGED: 
case WM_POINTERDOWN: 
case WM_POINTERLEAVE: 
case WM_POINTERUP: 
case WM_POINTERUPDATE: 
    { 
     UINT32 pointerId = GET_POINTERID_WPARAM(wParam); 
     POINTER_INPUT_TYPE pointerType; 

     if (GetPointerType(pointerId, &pointerType)) 
     { 
      if (pointerType == PT_TOUCH) 
      { 
       ... 
      } 
     } 
    } 
    break; 
... 
+0

感謝。上記の例はありますか? – blez

+0

Windowsフックを使用するためのリンクとコードスニペットを追加しました。これらがあなたが必要とする例であるかどうかはわかりません。 – Luke

+0

Windows 7のWindows HookソリューションのFYI(WH_CALLWNDPROCとWH_GETMESSAGE Hooksの両方)は、他のプロセスで実行されるため、標準エラーと標準出力は期待どおりに表示されません。代わりに、ファイルを作成してファイルに記録します。そして、どちらもWindows 7でWM_INPUTまたはWM_TOUCHを取得していないようです。今は、生の入力がバイナリとして機能しているか、はいタッチが使用中であるか、またはタッチが使用されていません。投稿に感謝します。 – phyatt

関連する問題