Skip to content

About

Convert HID touchscreen input into real mouse events (move, click, wheel scroll) on a chosen monitor - Windows, C++

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

touch2mouse

A Windows CLI tool that converts HID touchscreen input into real mouse events (absolute move, left button, and wheel scrolling) on one chosen monitor. Documentation below is in Japanese.

タッチスクリーンの入力を本物のマウスイベントに変換して送出する Windows 用コマンドラインツール。

Windows 標準のタッチ→マウス変換(タップ判定の遅延、長押し右クリック、フリック/パンなどのジェスチャ認識)を 対象モニタ上でだけ握り潰し、代わりに自前のジェスチャ判定で SendInput を投げます。

主な用途: ターミナル(Claude Code CLI など)はマウスホイールしか見ないので、タッチのスワイプを MOUSEEVENTF_WHEEL に変換してやらないとスクロールできません。素の左ボタンドラッグにしてしまうと ターミナル上では「テキスト範囲選択」になってしまいます。

ジェスチャ(--mode auto、既定)

操作 送出されるマウスイベント
タップ(動かさず離す) 左クリック
スワイプ(しきい値以上動かす) ホイールスクロール(縦=WHEEL/横=HWHEEL)
長押ししてから動かす 左ボタンドラッグ(範囲選択など)

スクロール方向は既定で「コンテンツが指に追従する」向き(指を下へ→上へスクロール)。 --reverse-scroll で反転します。

--mode click にすると接地=左ボタン押下の単純変換、--mode scroll にすると常にホイールのみになります。

仕組み

  1. Raw Input(UsagePage 0x0D / Usage 0x04 = Touch Screen)を RIDEV_INPUTSINK で登録し、 フォーカスに関係なく生の HID レポートを受け取る
  2. HidP_* API でレポートを解析(X / Y / Tip Switch / Contact Identifier / Contact Count)
  3. 論理座標を回転・反転してから、対象モニタの矩形へ線形マップ
  4. 接地からの移動量と経過時間でジェスチャを判定し、SendInput で MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK の移動/左ボタン/ホイールを送出
  5. Windows 自身が生成するタッチ由来のマウスイベント(dwExtraInfo が 0xFF5157xx)を WH_MOUSE_LL フックで握り潰し、入力が二重に効くのを防ぐ。 既定では対象モニタの矩形内に限定するので、他のディスプレイのタッチ/ペンは通常どおり動く

最初に接地した指だけを追跡します(2 本目以降は無視)。

ビルド

MinGW-w64 の g++(hidsdi.h / hidpi.h / libhid.a を含むもの)が PATH にあれば:

.\build.ps1

手動なら:

g++ -std=c++17 -O2 -o touch2mouse.exe src\main.cpp -lhid -luser32 -lgdi32

使い方

1. モニタとタッチデバイスを確認

.\touch2mouse.exe --list
Monitors:
  [1] \\.\DISPLAY1    3840 x 2160  at (    0,    0)  rot=0    (primary)
  [2] \\.\DISPLAY5    2160 x 3840  at ( 3840, -141)  rot=90

Touchscreens:
  \\?\HID#VID_29BD&PID_4101&Col02#...
      contact slots: 10   X: 0..4095   Y: 0..4095   contactCount=yes
  \\?\HID#VID_256C&PID_006B&MI_02#...
      contact slots: 10   X: 0..16384   Y: 0..9600   contactCount=yes

このマシンでは [2] が KD1(縦向き 2160×3840)、そのタッチパネルが VID_29BD、 VID_256C は Huion Kamvas Pro 19 側です。

2. 座標の向きを合わせる(--watch)

--watch はマウスを一切動かさず、生の座標と変換後の画面座標を表示するだけのモードです。

.\touch2mouse.exe --monitor 2 --device VID_29BD --watch

対象ディスプレイの左上と右下を順に触って、screen=(...) が そのモニタの矩形の左上/右下に近い値になるか確認します(上の例なら左上が約 (3840,-141)、 右下が約 (5999,3698))。

ずれていたら次で調整します。回転はデフォルトでモニタの向き(上の例なら rot=90)に追従しますが、 パネル側の実装によっては合わないので、その場合は明示指定してください。

症状 対処
縦横が入れ替わる --rotate 0 / 90 / 180 / 270 を順に試す
左右だけ反転する --flip-x
上下だけ反転する --flip-y

3. 本番実行

.\touch2mouse.exe --monitor 2 --device VID_29BD

終了は Ctrl+Alt+Q または Ctrl+C。終了時に押下中のボタンは必ず解放されます。

オプション

オプション 説明
--list モニタとタッチスクリーンを一覧表示して終了
--monitor N 変換先モニタ(--list のインデックス)。必須
--device SUBSTR Raw Input デバイス名にこの文字列を含むものだけ使う(例 VID_29BD)
--all-devices タッチスクリーンが複数あっても全部使う(既定は複数あるとエラー)
--watch 注入せず接点情報を表示するだけ(キャリブレーション用)
--mode auto|click|scroll ジェスチャの解釈(既定 auto。上表参照)
--scroll-px N ホイール 1 ノッチあたりの指の移動量[px](既定 100。小さいほど速く回る)
--reverse-scroll スクロール方向を反転
--move-threshold N スワイプと判定する移動量[px](既定 24)
--hold-ms N 左ドラッグに移行する長押し時間[ms](既定 350)
--rotate 0|90|180|270 マップ前にタッチ座標を回転。既定はモニタの向きに追従
--flip-x / --flip-y 回転後に軸を反転
--suppress none|touch|pen|both Windows 側のポインタ由来マウスイベントのどれを握り潰すか(既定 touch)
--suppress-everywhere 対象モニタ内だけでなくデスクトップ全体で握り潰す
--watchdog MS 押下中に MS ミリ秒レポートが来なければ強制的にボタンを離す(既定 off)
--verbose ジェスチャの遷移をログ出力

既知の制約

  • タッチ対応アプリには二重に届きます。 WH_MOUSE_LL で潰せるのは Windows が生成した マウス イベントだけで、WM_POINTER / WM_TOUCH はユーザモードからは止められません。 タッチを直接扱うアプリ(ブラウザ、UWP、Office など)では、本ツールのマウス入力とアプリ自身の タッチ処理が同時に走ります。ターミナルのようにマウスしか見ないアプリが対象です。 完全に止めるにはフィルタドライバか、デバイスマネージャで該当タッチスクリーンを無効化する必要があります。 なお Windows Terminal は WM_POINTER を自前で処理してタッチスクロールに対応しているため、 二重スクロールになる場合があります。その場合は conhost 側で使うか、--scroll-px を大きめにしてください。
  • 管理者権限のウィンドウ上では UIPI により、非管理者で動かした本ツールのフックも入力注入も効きません。 対象アプリが管理者権限なら、本ツールも管理者で起動してください。
  • 右クリックは未実装。2 本指タップ→右クリック等が必要なら拡張可能です。
  • スクロールに慣性(フリック)はありません。指の移動量にそのまま比例します。
  • 押下中にレポートが完全に止まるデバイスではボタンが押しっぱなしになり得ます。その場合は --watchdog 800 などを付けてください(長押し操作とはトレードオフ)。

ライセンス

MIT License. 詳細は LICENSE を参照してください。

About

Convert HID touchscreen input into real mouse events (move, click, wheel scroll) on a chosen monitor - Windows, C++

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages