トラックポイントの中クリックとスクロールを両立する「nubmiddle」を作った話

この記事にはEnglish版もあります。

目次

何年越しか分かりませんが(数えたら 9 年でした)、ThinkPadのトラックポイントと中ボタンをWindows上で快適に使うための設定 の続編です。 トラックポイントの中ボタンで、中クリックと中ボタンスクロールを両立するだけの Windows 用ツール「nubmiddle(ナブミドル)」を作って、Microsoft Store で公開しました。

やることは 2 つだけです。

  • 中ボタンをクリック → 普通の中クリック(タブを閉じる、リンクを新しいタブで開く、など)
  • 中ボタンを押したままスティックを倒す → 縦・横スクロール

ちなみに、名前の「nub」は英語で「小さな突起」のことです。 日本の ThinkPad ユーザーが「赤ポッチ」と呼ぶアレに当たる言葉で、英語圏の ThinkPad 愛好家にはこれで通じます。 その nub の中ボタン(middle button)のためのツールなので、nubmiddle です。

これまでのあらすじ

  • 2017 年に、上の記事を書きました
    • Lenovo の公式ドライバでは「中ボタンスクロール」と「中クリック」が択一で、両立できません(Linux では最初から両立できるのに)
    • そこで TPMiddle という常駐ソフトを入れて解決、という内容でした
  • 2019 年の追記で、W10Wheel.NET に乗り換えたと書きました
  • それから nubmiddle を作るまで、ずっと W10Wheel.NET のお世話になっていました
    • ダウンロードした実行ファイルを OneDrive に突っ込んでおいて、OS をセットアップするたびに、タスクスケジューラーに「管理者権限で自動起動する」設定を書く、という運用です
      • 管理者権限で動かさないと、管理者権限のウィンドウ(管理者として開いたターミナルなど)の上では中ボタンの操作が効かないので
    • 手間といえばそのくらいで、すごく面倒だったと言うほどの話ではありません
    • ただ、版を上げることすら面倒で、新しい版が出ているのに、かたくなに同じ版を使い続けていました
      • セキュリティの問題やメモリのリークが直っているかもしれないのに、です。これは不健全だなと思っていました
    • それに、トラックボールや多ボタンマウス向けの機能がたくさんあるツールで、自分が使っているのはそのうちの 1 つだけでした
  • TPMiddle に戻る手もありません
    • Synaptics のドライバの API に頼っているので、ELAN 製のトラックポイントになった機種(X390 以降とのこと)では動かないという報告があります

なんで作ったのか

  • 欲しいものは、ずっと変わっていません

    • 中クリックとスクロールの両立だけをする
    • 入れたら終わり。自動起動も更新も、自分で面倒を見てくれる
    • トラックポイントのメーカーや機種に左右されない
  • 改めて探してみましたが、全部を満たすものは見つかりませんでした

    手段自分にとって足りなかったところ
    TPMiddleSynaptics の API に依存。ELAN 製では動かないとの報告。更新も止まっている
    W10Wheel.NET動く。ただし多機能なホイールシミュレータで、管理者権限での自動起動は手で設定する
    X-Mouse Button Control / AutoHotkey設定すれば実現できる。ただし汎用のツールで、設定を自分で書く
    • どれも悪いツールではなく、自分の「これだけでいい」に対して大きすぎた、という話です
  • そして出会えないまま、AI 駆動開発の時代が来てしまいました

    • この種のツールは、OS の低いレイヤーの API(マウスのフックや、タスクスケジューラーへの登録など)を叩かないと作れません。ノウハウが無いと、自力で実装するのは大変だろうなと思っていました
    • ところが、同じように「既存のツールはあるけど、ちょっとした不満がある」で作り始めた rigtop と FlexFlyout が、実装の大半を Claude Code に任せたら、あっさり作れてしまいました
    • それに比べれば、nubmiddle は機能もミニマルです。「これも作れそう」と思ったので、作りました(きっかけは本当にそれだけ)
    • (今の時点では、の話です。道具は数か月で入れ替わるので、来年には作り方ごと変わっているかも)
  • 言語は Rust にしました

    • ランタイムの要らない小さな exe 1 つにできる(TPMiddle のときは Visual C++ のランタイムを入れる手順がありましたね……)
    • ARM64 版も同じように作れる
    • 管理者権限で常駐することもあるツールなので、メモリ安全な言語がいい

どんなツール?

通知領域のアイコンから開いたメニュー。スクロールするデバイスを選んでいるところ

  • 通知領域(タスクトレイ)に常駐します。設定は全部、アイコンのメニューにあります
  • スクロール中はカーソルがその場に留まり、スクロールの向きを示す矢印になります
  • スクロールは始めた向きの軸に固定されます。縦にスクロールしているときに指が少し横にぶれても、横には流れません
  • 縦・横それぞれ 5 段階の速さ
  • スクロールするデバイスを選べます
    • トラックポイントだけスクロールにして、普通のマウスの中ボタンはそのまま、という使い分けができます
    • Blender や CAD で、マウスの中ボタンドラッグ(画面の移動)を潰したくない人向けです
  • スクロールの代わりに、普通の中ボタンドラッグにするモードもあります
  • Windows の起動時に開始(メニューにチェックを付けるだけ)
  • 日本語と英語
  • データは集めませんし、ネットワークにもつなぎません
  • 無料のオープンソース(MIT)です

使ってみる

インストール

  • Microsoft Store(おすすめ): https://apps.microsoft.com/detail/9NNH2W7M8MGP
    • Store が署名してくれるので、SmartScreen の警告が出ません。更新も Store が配ってくれます(もう、古い版をかたくなに使い続けなくて済みます)
    • Windows 11 用です
    • 1 つだけ制約があります。Store 版は管理者権限で起動できないので、管理者権限のウィンドウの上ではスクロールできません(下の「管理者権限のウィンドウ」を参照)
  • インストーラー / zip: GitHub の Releases から
    • ほとんどの PC は x64、Windows on ARM は arm64 です
    • まだコード署名が無いので、初回の起動で SmartScreen の警告が出ることがあります(「詳細情報」→「実行」で起動できます)
    • zip 版は、好きなフォルダに展開して nubmiddle.exe を起動するだけです。同じフォルダに空の nubmiddle.ini を置くと、設定もそこに保存されます(OneDrive に置いて複数の PC で共有、というのもできます)

ドライバの設定を「中クリック」にする

  • 前の記事では「スクロールに使用する」を選びましたが、今回は逆です
    • Lenovo(Synaptics / ELAN)のドライバの設定で、中ボタンの動作を「スクロール」ではなく「中クリック」にしてください
    • 「スクロール」のままだと、ドライバが中ボタンを自前でホイールに変換してしまい、nubmiddle から中ボタンが見えないことがあります
  • nubmiddle は Windows に届いたマウスのイベントを見て処理します。ドライバの API を使わないので、メーカーに左右されません

起動して試す

  • 起動すると、通知領域にアイコンが出て、場所を案内する通知が出ます
  • ブラウザで試してみます
    • タブを中クリック → 閉じる
    • ページの上で中ボタンを押したままスティックを倒す → スクロールする
    • 両立できました。お疲れ様でした!
  • あとはメニューの「Windows の起動時に開始」にチェックを付けておけば、設定は終わりです
    • shell:startup のフォルダを開いてショートカットを作って……という前の記事の手順は、もう要りません

管理者権限のウィンドウ

  • Windows の仕組み(UIPI)で、普通の権限で動いているプログラムは、管理者権限のウィンドウに入力を送れません
    • なので、管理者として開いたターミナルなどの上では、nubmiddle を管理者権限で動かさないとスクロールできません
  • インストーラー版・zip 版: メニューの「Windows の起動時に開始 (管理者)」にチェックを付けると、タスクスケジューラに「ログオン時に管理者権限で起動する」タスクを登録します
    • チェックを付けるときに UAC の確認が 1 回出るだけで、ログオンのたびには出ません
    • exe の場所を変えたら、起動したときに気付いて登録し直します
  • Store 版: 管理者権限では起動できないので、管理者権限のウィンドウの上ではスクロールできません
    • 管理者のターミナルをよく使う方は、インストーラー版をどうぞ

作るときに詰まったところ

  • 仕組みは単純です
    • 低レベルのマウスフックで中ボタンの押下をいったん握りつぶして、保留します
    • 押したまま動いたら、移動を握りつぶして(カーソルは動かさない)、移動量をホイールの入力に変えて送ります
    • 動かないまま離されたら、保留していた押下と解放を、中クリックとして送り直します
  • ……のはずが、実際に使ってみると、いくつか引っかかりました。さわりだけ
    • Windows の「設定」アプリでスクロールが激しく振動する: 縦にスクロールしているつもりでも、指のぶれで横の入力が少し混ざります。縦と横のホイールが交互に届くと、「設定」アプリは位置が行ったり来たりします。スクロールを始めた向きの軸に固定するようにして直しました
    • 管理者権限のウィンドウが前面にあると、フックがそもそも呼ばれない: 入力を送れないだけでなく、マウスのイベントが届かなくなります。その間はカーソルも一緒に動いてしまいます。管理者権限で動かすしかありません
    • どのデバイスの中ボタンかは、フックでは分からない: デバイスを見分けるには Raw Input という別の仕組みを併用します。ところが、フックと Raw Input のどちらが先に届くかは決まっていません(中ボタンの押下では Raw Input が先、移動ではフックが先でした)。どちらが先でも判定できるようにしています
    • Microsoft Store の審査に 1 回落ちた: ブラウザをスクロールしている画面をスクリーンショットにしたら、「アプリ自身が写っていない」と言われました。常駐ツールあるあるかも。トレイメニューの画面に撮り直して通りました

どうやって確かめながら作ったか

  • 実装はほとんど Claude Code に任せ、自分は要件を決めることと、判断(名前、既定の動作、Store に出すか)と、実機での確認を受け持ちました
  • この種のツールは、実機で触らないと分からないことが多いです
    • 上の「設定アプリで振動する」も「管理者のウィンドウでカーソルが動く」も、自分が外付けのトラックポイント・キーボードで触って気付きました
    • 気付いたことを伝える → Claude Code がログを足した版を作る → もう一度触ってログを渡す → 原因が分かって直る、という流れでした
  • Store 版の確認(インストール・起動・メニュー・自動起動)は、Claude Code が Windows 11 の仮想マシンで自分で動かして確かめています

動作を確認した環境と、動作報告のお願い

  • 確かめた環境(nubmiddle v0.4.0)
    • Windows 11
    • ThinkPad USB トラックポイント・キーボード(SK-8855、有線)
    • ThinkPad トラックポイント・キーボード II(Bluetooth / USB レシーバー)
  • まだ確かめられていないもの
    • ThinkPad 本体の内蔵トラックポイント(Synaptics / ELAN): 仕組みの上では動くはずですが、まだ確かめられていません(理由は最後に)
    • HHKB Studio など、ThinkPad 以外のスティック: 中ボタンが普通の中ボタンとして Windows に届くなら動くはずです
  • 動いた・動かなかったの報告を、GitHub の Issues で歓迎します
    • うまく動かないときは、nubmiddle --trace --log trace.log で起動すると、中ボタンとホイールのイベントがログに出ます。それを付けてもらえると助かります

おわりに

9 年前の記事は、今でも読んでくださる方がいるようです(ありがたいことです)。 同じことで困っている方が、今度は Store から入れてチェックを 1 つ付けるだけで済むようになっていれば嬉しいです。

……と、ThinkPad ユーザー代表みたいな顔でここまで書いてきました。 でもぶっちゃけ、愛機の ThinkPad T14s Gen 4(AMD)には CachyOS を入れて快適に使えちゃってるから、ThinkPad の実機で Windows 上の動作テストはまだできてないんですけどね! (前の記事に「ThinkPad に Ubuntu を入れたら、最初から快適に使えるんです」と書いた通りで、Linux だと中クリックもスクロールも最初から両立できてしまうので……)

というわけで、ThinkPad 本体の Windows で試してくださる方、動作報告をお待ちしています。