.Net Framework 4.7 のWPF Touch/Stylus support をあまり考えずに有効にしたらはまったこと
早いもので半年以上前にリリースされた.Net 4.7です
リリースノートはこちら
この記事に
WPF Touch/Stylus support for Windows 10
ってのがありまして、More reliableとかMore capableとかよさげなことが書いてあるんですね
ということで何も考えずに有効にしてました
有効にするにはapp.configに
<configuration> <runtime> <AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.EnablePointerSupport=true"/> </runtime> </configuration>
って足せばいいだけなので簡単ですね
問題発生
とりあえず下に動画貼ります(iPhoneで撮った動画をそのまま上げたらなんか小さいんですがなんでですか)
Surface Pro2現役ですよ!!!1
WPFでInkCanvasを置いて画面左上のボタンでデスクトップを180°回転できるようにしてます
デスクトップの回転はUser32.dll
のSetDisplayConfig
を呼んでます
通常時は当たり前ですがちゃんとペンでなぞった部分に描画します
しかし180°回転させた状態でペンで描くと180°反対側に描画してしまいます(動画には入っていませんがマウスだとちゃんとポインターの場所に描画されます)
dnSpyさんで処理を追っていくとStylusのMoveイベントの時の座標取得をStylus系(?)じゃなくてPointer系(マウスの座標とるやつ)を使っていてそれが画面の回転を考慮してないっぽいんですね
上で追加した設定でもうちょっとググったら
軽減策: ポインター ベースのタッチおよびスタイラスのサポート | Microsoft Docs
なんてのが
WM_POINTERベースにするってかいてあるんですが、そんなことリリースノートに書いてないと思うんですよ
ということで先ほどの設定を消して実行すると
デスクトップを回転してもちゃんとStylusの位置に描画されました
この動作が仕様通りなのかバグなのかもわからないし、あの設定はなんのためにできたんだろう(しらべてない)
きっとだれの参考にもならないことでした