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 に変換してやらないとスクロールできません。素の左ボタンドラッグにしてしまうと
ターミナル上では「テキスト範囲選択」になってしまいます。
| 操作 | 送出されるマウスイベント |
|---|---|
| タップ(動かさず離す) | 左クリック |
| スワイプ(しきい値以上動かす) | ホイールスクロール(縦=WHEEL/横=HWHEEL) |
| 長押ししてから動かす | 左ボタンドラッグ(範囲選択など) |
スクロール方向は既定で「コンテンツが指に追従する」向き(指を下へ→上へスクロール)。
--reverse-scroll で反転します。
--mode click にすると接地=左ボタン押下の単純変換、--mode scroll にすると常にホイールのみになります。
- Raw Input(UsagePage
0x0D/ Usage0x04= Touch Screen)をRIDEV_INPUTSINKで登録し、 フォーカスに関係なく生の HID レポートを受け取る - HidP_* API でレポートを解析(X / Y / Tip Switch / Contact Identifier / Contact Count)
- 論理座標を回転・反転してから、対象モニタの矩形へ線形マップ
- 接地からの移動量と経過時間でジェスチャを判定し、
SendInputでMOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESKの移動/左ボタン/ホイールを送出 - 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.\touch2mouse.exe --listMonitors:
[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 側です。
--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 |
.\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 を参照してください。