アプリで板タブのような挙動がしたい

実現したいこと

現在タッチ対応のモニター1枚と通常モニター2枚の環境下で作業しております。
その時に「タッチモニターから他のモニターをタッチ操作したい」と考えました。
具体的には以下の通りです。
・アプリを展開し、タッチ操作したいモニターを指定、指定領域内(grid内やusercontrol内など)をタッチ操作すると、指定されたモニターでタッチ操作が行える。
・タッチ操作は、タップやダブルタップだけでなく、スクロール移動などのドラッグ操作も含める
・アプリを縮小すると、その倍率に合わせた位置となる。

前提

環境がwindows11なのでwindowsで動ければそれでいいです。macとかchomebookとか知りません。
C#で開発してます。理由は自分がC#しかまともに書いてないからです。
アプリのフレームワークは.netのWPFを採用する予定です。理由はwinformではtouchイベントが実装されてないので実装できないんじゃないかと思ったのと、単純に以下のmicrosoftのページでめっちゃWPF推してるんで「タッチ推奨なんだろうな」と思ったからです。ココは正直WPFでもwinformでもどっちゃでも構いません。
https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/advanced/walkthrough-creating-your-first-touch-application?view=netframeworkdesktop-4.8

試しているやり方

ネットで「動的にタッチ操作を行う方法」を検索したのですが、出てこなかったため「windowsAPIにあるマウス操作」で妥協することとした。本当はタッチ操作が良いのですが...(タッチ操作で分けられるアプリ内操作があるので)
空のUserControlを作成し、コンストラクタに以下のコードを追加

C#

1// タッチイベント追加2Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);

そして、Touch_FrameReportedメソッドが以下の通りです

C#

1foreach (TouchPoint _touchPoint in e.GetTouchPoints(this))2{3 // マウスカーソルの移動4 MousePoint = new Point((newカーソル位置X),(newカーソル位置Y);5 SetCursorPos((int)MousePoint.X, (int)MousePoint.Y);6 7 // 画面に指を置く行為8 if (_touchPoint.Action == TouchAction.Down)9 {10 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);11 }12 // 画面上で指をドラッグする行為13 else if (_touchPoint.Action == TouchAction.Move && e.GetPrimaryTouchPoint(this) != null)14 {15 16 }17 // 画面から指を離す行為18 else if (_touchPoint.Action == TouchAction.Up)19 {20 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);21 }22}

失敗している原因

自分が想定していた動きとしては「タッチ操作と連動してマウスカーソルが移動する」ようになると思ってましたが、先の方法で試した結果、「タッチ時にカーソルが移動してマウスのレフトダウン。その直後にカーソルが指の位置に移動。指が置かれているので直後にマウスカーソルが移動、その直後に指の位置にカーソルが移動するの繰り返し」となりました。
要は指が置かれている位置とSerCursorPosでカーソルが反復横跳びしている状態となりました。
こうなった原因は「WPFがタッチ操作をするとカーソルが指の位置に移動する仕様となっている」と考えております。つまり、やり方を変えない限りは目標にたどり着くことができません。

質問内容

今までの内容を要約すると、「タッチ操作のリアルタイムな遠隔操作がやりたいが、いい案が思いつかない」ということです。というか、「タッチ操作のリアルタイムな遠隔操作」ができるのかすら怪しい限りです。まず可能かどうか、可能ならばそのやり方を教えてほしいです。

コメントを投稿

0 コメント