GPD WIN 2に非公式ゲームパッドドライバを入れてWindowsの操作を少し良くする

劇場版シティーハンター<新宿プライベート・アイズ>良かったですね。戦闘マシーン類を敢えて滑らかな1コマ打ち(24fps)に固定したのは好みが分かれそうですけど、80~90年代アニメの続編として「旧いものと新しいもの」「人間と無人機」「作画と3DCGI」といった構図をはっきりさせるのに貢献したかなと思っています。まあそれら構図自体はベタを通り越してヤボな感もありますが。

シティーハンターは置いといて、前に感想を書いたGPD WIN 2の使い勝手に関わる話です。

先に注意しておくと、表題の非公式ドライバのインストールは割と面倒だし、入力遅延が少し悪化するからやらない方がいいし、何よりここに書かれた内容をあなたが実行したことで万一あなたのPC環境やユーザーアカウントその他財産等が損害を受けたとしても当方では如何なる責任も負うことはできません。

Windowsの操作をゲームパッドでまかなう際の課題

今回扱うGPD WIN 2という機械は本体にスティックとボタンを備えており、中央のセレクタでマウスモード・ゲームパッドモードを切り替える仕組みになっています。

f:id:appalerm:20180518095744j:plain

(写真は去年の使い回し)

しかしGPD WIN 2のマウスモードは前世代譲りかそれより悪くなった壊滅的なアサインであるため、パッドをゲームモードに固定し、JoyToKey、Controller Companion、Xpadder、JoyAdapterなどのゲームパッド - マウス入力間を変換する補助アプリケーションを使われているかたも多いと思います。あるいはGPD WIN以外でも、ごろ寝用途や作業補助などにJoyToKey類を導入されているかたも居らっしゃるかもしれません。

そこで邪魔になるのがWindows 1803(April 2018 Update)あたりから導入された中途半端なゲームパッド対応です。

f:id:appalerm:20190321015027g:plain

最近のWindowsでは、OSがわざわざゲームパッドの入力を読み取ってスタートメニュー等にフォーカスを出すようになりました。その結果JoyToKeyによるマウスカーソル操作とWindowsによるフォーカス操作が同時に現れ混乱を招いています。

この挙動はスタートメニューやタスクバーの一部と、「設定」を含むUWP App(いわゆるストアアプリ)の一部に限定されており、幸か不幸かエクスプローラなどのいわゆるWin32アプリケーションでは起こりません。

10フィートUIにマルチデバイス対応。じつに結構なことですが、この補助機能をオフにできないのは、私がゲームパッド+JoyToKey類のような特殊環境を使っているのを差っ引いてもちょっと問題があると思っています(Windows教えてgooことMicrosoftコミュニティでも「フライトスティック等を放置しているだけでOS操作に干渉してくる」などの問題として報告されていますが、日本語英語ともにまともな答が見つからないので無効化はどうしても出来なさそうです)。

現状WindowsのインターフェースはOS・ソフトウェア共にリモコンやゲームパッドで動かせるほどには洗練されていないし(例えば先述のようにスタートメニューの項目はパッドで選べますが、スタートメニューそのものを呼び出すことはできません)、そもそも皆がみんなWindowsをカーソルキーと決定・戻るボタンだけで操作したいとは限りません。そうした機能は必要な時もあれば不要な時もあるでしょう。標準機能というには範囲が貧弱すぎるし、オプションというには無効化手段がありません*1。中途半端と呼ぶしかないフィーチャーです、これは。

MSへの批難はさておき、OSで切れない設定ならばゲームパッド側で迂回してみましょう。今回はこのつらいUIを避けるためにどれほどの犠牲を支払えるかを考えていきます。

前提:非公式ドライバx360cの導入と課題

このUIに余計なフォーカスを当てるゲームパッドサポートには、Xbox 360世代以降のXInputという仕組みが使われています。

そして360世代より前から使われている仕組みのDirectInputであれば、Windows側のUIに干渉しません。幸いGPD WIN 2のパッドはデバイスマネージャーで見る限りXbox 360 Controllerとして認識されているため「箱コン」との互換性はあるはずで、ならば有志による代替ドライバx360c(再配布)が入るのではと思いました。

f:id:appalerm:20190321024935p:plain

概念としてはこのようになります。対応タイトルのことはのちほど。

f:id:appalerm:20190321180951p:plain

できた(名前はてきとうにつけた)。結論としてはインストールでき、OS側UIに干渉しなくなるので狙い通りになります。設定ユーティリティから見る限りフォースフィードバックまで機能している。

ただしx360cドライバは未署名、かつWindows 7世代で開発が終わっており、何より本来非対応のデバイスなので導入にけっこう手間があります。

  1. ダウンロードしてきたx360cのinfファイルをテキストエディタで開き、デバイスマネージャーから確認したVID/PIDをもって任意のVID/PIDを上書きするか、新規にセクションを作る(infは試行錯誤しながら切り刻んだので人にお見せできる状態じゃない‥‥)
  2. 管理者権限でbcdedit /set TESTSIGNING ONを実行後再起動してテストモードに入る
  3. バイスマネージャー上からXbox 360 Controllerのドライバを「ディスク使用」で更新する。この時、ドキュメントでは一時的にUACを切っておけと言われている
  4. たぶんコントロールパネルから専用ユーティリティが起動しないので、ドライバ同梱のx360sai.exeを起動して1回以上ユーティリティを開いておく

この時点でしんどい。何よりこの2019年にDirectInputパッドだけでPCゲーム界を生きていくのは難しいかと思います。JoyToKey以外のマウスエミュレーションソフトであるところのController CompanionDirectInputはサポートしていません‥‥。

ですのでここからは、XInputのみ対応するゲームの多い現代においてレガシーなDirectInputパッドを(できるだけOS側UIに干渉させないまま)使うための方法を3つほど挙げていきます。なおSteamの備えている入力トランスレーションは扱いません。

方法1: Xbox360 Controller Emulatorでゲーム毎にXInput入力を得る

Xbox 360 Controller Emulatorこと以下x360ceは、インストールされている各ゲームに対し個別に変造ライブラリを読み込ませることでDirectInputパッドをXInputかのように思わせるというトリッキーなソフトウェアです。ネットゲームなどではチート対策に引っ掛かることがあるかもしれません。

f:id:appalerm:20190321030410p:plain

まずはやってみましょう。ゲームアプリケーションのあるディレクトリへx360ceを放り込んで起動し、xinput1_3.dllが生成されキーアサインを決めれば設定完了です。

f:id:appalerm:20190321181757p:plain

良さそう(画面の縦サイズはギリギリですが……)。先述のController Companionに入れてみたところ、ガイドボタンの割り当てが機能しない以外は違和感なく動きます。

  • メリット
    • ゲームタイトル毎にdll呼び出しをフックするため、適用するゲーム・しないゲームを自分で選べる
    • どのような状況でもWindowsのカーソル移動とカブることがない
    • 導入してしまえば後々特別な操作はない
  • デメリット
    • ガイドボタン(しいたけ)が利かん
    • 新しいゲームを入れるたびに適用の手間がかかる
    • タイトルによっては改造・チートと見なされる可能性がある(dllフックのあたりで)
    • タイトルによってはそもそも適用できない可能性がある

「全部のタイトルにx360ceを導入していくのは面倒」という一点を除けば、かなり良いです。その一点が問題ではあるんだけど‥‥。

方法2: devconコマンドでコントローラ設定を用途別に切り替える

他のアプローチを考えます。たとえば非公式ドライバと公式ドライバを素早く簡単に行き来できれば、ゲームをする時はXInput、それ以外はDirectInputという逃げ方によってWindowsへの干渉をある程度避けられるはずです。

f:id:appalerm:20190321030608p:plain

DirectInputモードの時も動かしたいアプリケーションがあれば、個別に先ほどのx360ceを適用すればいいわけです。

バイスマネージャ同様の操作をコマンドラインから行えるdevconコマンド(調達は各自)を試します。

:: DirectInput版ドライバ(非公式かつ改変済み)に切り替えるバッチ
devcon.exe update x360c.win7.x64.ja\x360c.inf "USB\VID_0079&PID_18D4"
:: XInput版ドライバ(公式)に切り替えるバッチ
devcon.exe update "C:\Windows\System32\DriverStore\FileRepository\xusb22.inf_amd64_db4bf1cd593728ff\xusb22.inf" "USB\VID_0079&PID_18D4"

:: ついでに非公式ドライバの設定ユーティリティを削除
del C:\Windows\System32\x360cps.dll

が、図にも書いた通り、これを適用するにはどうしても再起動が必要だったので良くないですね。

  • メリット
    • ゲームやドライバを変造する必要がない
  • デメリット
    • OS側UIと干渉しないためには能動的に切り替える必要があり、しかも再起動を要する

何とか抜け道を見つけて10秒以内に切り替えられるようになればもうちょっと実用的かと思います。

方法3: XOutputでシステム全体へのXInput入力を一時的に得る

とにかくゲーム個別の設定を作りたくないし再起動もしたくない気持ちから、仮想のXInputコントローラを新たに生やして有効無効を切り替えるという更に回りくどい解決を考えました。

探してみたところXOutputという正にそのもののアプリケーションが見つかったため、これを使います。

f:id:appalerm:20190321030724p:plain

(厳密にはDirectInput側入力をシャットアウトするのではなく二系統の入力が同時にWindowsに渡ることになりますが、作図の都合で省きました。特に気を利かせてDirectInput, XInput両対応しているようなゲームではおかしなことになる可能性が高い。

XOutputはインストールにViGEm frameworkという仮想ゲームパッドドライバを要求され、PowerShellコマンドを管理者権限で実行するよう言われたりなどこれもちょっと手間ですね。

f:id:appalerm:20190321184310p:plain

キーアサイン画面。GPD WIN 2実機でのスクリーンショットでお分かりかもしれませんが縦の解像度が足りずマトモに設定できないため、縦回転させるか外部ディスプレイを使うかします。

f:id:appalerm:20190321184801p:plain

設定完了の後、Startと書かれたボタンを押すと仮想Xbox 360コントローラデバイスが現れます。

XOutputの動作中はXInput対応ゲームで良好に動く反面、当然ながらWindowsのUIとは干渉します。devconの時と同じようにXOutputの有効無効はバッチファイル等で簡単に切り替えられるようにしたくなるし、幸いXOutputは--minimizedオプションでタスクトレイに常駐させることができます。

:: XOutputを開始(二重起動は防止)
tasklist | find /C "XOutput.exe"
IF ERRORLEVEL 1 (
  start "" XOutput.exe --minimized
)
:: XOutputを終了
tasklist | find /C "XOutput.exe"
IF NOT ERRORLEVEL 1 (
  taskkill /F /T /IM "XOutput.exe"
)

あとはゲームする前にON操作をしたり、UI干渉してほしくない時にOFFを叩いたりを局面によって手動なり自動なりでやっていけばよさそうです。

  • メリット
    • 切り替えが速くて楽
  • デメリット
    • いくら速かろうが切り替え操作をすること自体が快適でないという見方はある
    • タスクトレイに強制終了特有のゴミが残る
    • 今更だけど何処ぞのものとも知れんカーネルモードドライバを更に入れる必要がある
    • タイトルによってはまともに使えない(私の環境では「ドラゴンファングZ」が特にダメ、DirectInput入力も拾ってしまう)
    • タイトルによっては改造・チートと見なされる可能性がある(仮想デバイスのあたりで)

x360ceと比べると、ゲーム導入時の面倒を取るか、起動時の面倒を取るかの二択になりますね。devcon叩いて再起動するよりはマシだと思う。

入力遅延について

ここまで書いといて何ですが、使っているDirectInputドライバ(x360c)がXInputより1フレーム程度遅いかもしれません。

ふと気になってHTML5 Gamepad Testerスマートフォンの240fpsカメラで撮ってみたところ、方法3に登場するDirectInputドライバとXOutput仮想ドライバの差が確認できなかった(=入力を複製する時点での遅延はゼロか、または1フレーム以内に収まる)のに対し、そのXOutput仮想ドライバと入れ替える前の標準XInputドライバとの間では大体4/240~7/240秒程度の差が出ています。

GPD WIN 2のパッドをHTML5 Gamepad APIで使う限りにおいて、XInput(標準)が3~4フレームの遅延、DirectInput(x360c)が4~5フレームの遅延ということです。計測メモを紛失したラフなものだったし体感はできていないのですが、いざ測ると気になってしまう‥‥。

所感

どれを選んでも面倒くさすぎる。OS操作性の快適さを得る代わりにクリーンさを失い、癖の強い操作か癖の強いソフトウェアかその両方を引き受ける必要があります。

そもそもGPD WIN第一世代から第二世代の間に捨てられたDirectInputサポートを非公式ドライバという搦め手で復活させる初手の時点で何もかもが間違っているし、今回試して最も使い勝手の良かったXOutputにしても、自分で入れておいて何だがわざわざこんなことのために仮想デバイスドライバまで導入するというのが面白くない。しかもどうやらDirectInputの時点で遅いとなればいよいよ薦める理由は薄くなってきます。

余程「スタートメニューや設定UIがコントローラと連動して動く」という仕様に激怒している私のような人でもない限りは標準ドライバのまま使いましょう。他に何か対処法があったら教えてくださるとうれしいです。

以上です

先にも書きましたが、Windows 1803以降で大マイクロソフト様が「ゲームパッドでマウスエミュレーションなんかするな」とでも言わんばかりの投げやりなパッド対応を押し込んできたことには、GPD WINシリーズのような狂ったデバイスを使っていなかったとしても大いに不服です。10フィートUIやマルチデバイスなどの(それ自体はちゃんとした)大義名分から載ってくる実装がどうしてこんななんだ。

f:id:appalerm:20190322092157p:plain

Feedback Hubで「スタートメニューと設定とUWP Appで強引にコントローラ使おうとするのやめて〜〜」と読まれてなくても言っていくしかないのか。

参考リンク

続き

ちょうどいい感じのソフトが見つかったので続きを書きました。

eps-r.hatenablog.com

*1:JoyToKey類を使っているのはこちらの勝手なので「害がある」とまでは呼べませんが、そうでなくてもNetflix見てる時に不意にコントローラを動かしちゃって再生コントロールがヌッと出てくるとか、結構あるんですよね‥‥。