デスクトップのタッチスクリーンでWindows 8 Touch API ( WM_POINTERDOWN / WM_POINTERUPDATE / WM_POINTERUP ) をしばらく使用してきました。次に、テスト プログラムを Windows 8 タブレットで試してみたところ、ユーザーが画面に触れている場所をアプリケーションが正確に検出できないことがわかりました。
一方、マウスを使用すると、うまく機能しました。正しい座標が得られました。EnableMouseInPointer(TRUE)モードをアクティブにしているので、マウス イベントとタッチ イベントの処理に同じコードが使用されていることを意味します。これは、少なくとも私のコードがある程度正しく動作していることを意味します。
私が見つけたのは、タブレットでは高 DPI モードが有効になっており、ユーザーが画面上で非常に小さいものに触れることができるようになっていることです。タブレットの DPI を変更してスケーリングを削除すると、アプリケーションは正常に動作しましたが、デスクトップ画面の DPI を上げると問題が発生しました。(もちろん、私のアプリケーションは高 DPI 対応です)
面倒なことは、使用するデバイスによっては、タッチ インターフェイスから受け取る座標が明らかに異なることです。
- ユーザーがマウスを使用した場合、高 DPI スケーリングを考慮して座標がスケーリングされます。
- ユーザーがタッチ スクリーンを使用した場合、座標はスケーリングされず、物理的なピクセル単位になります。
それで、それを処理する正しい方法は何でしょうか?
明らかなハックは、 POINTER_INFO 構造体の pointerType メンバーをチェックし、タイプ( PT_TOUCH または PT_MOUSE ) に応じていくつかの再スケーリングを適用することですが、私が見る限り、それはどこにも文書化されていません。PT_PENを再スケーリングするかどうか。
それは非常にエレガントで将来性のあるものではないようです。
それをきれいに行う方法についての提案は大歓迎です。