syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

Xbox 360/Series Xコントローラーの競合とVisual C++ランタイムエラー

ヨドバシカメラエアダスターなどを物色していたところ、Xbox Series X|Sのワイヤレスコントローラー(EP2-29921/EP2-29931など、以下XSXコン)が期間限定セールになっているのを見つけたのでついに買いました。

これまで使っていたXbox 360コントローラー(以下箱丸コン)の左スティックが結構ボロボロになってきていて、そろそろ買い替えようと思っていたのでちょうどよかった。
箱丸コンは流線的なエルゴノミクスデザインで持ちやすく、全体的には使いやすいんですが、ハットスイッチ(十字キー、POVとも)の作りが甘く、正確な入力が困難で、昔のサードパーティ製の安物USBコントローラーと同じ程度の操作感でしかないのが不満でした。歴代の箱コンはPS系とは違って左右スティックが非対称の位置にあり、十字キーはおまけ扱いで、左スティックのほうがメインとなっています。3Dのシューター系ゲームは確かにこちらの配置のほうが適しているんですが、装備切り替えなどで十字キーを使うゲームもあり、正確な入力ができないのは致命的です。Xbox One以降は十字キーも改良されていて、XSXコンは押すと結構大きなクリック音がカチカチ鳴るのが賛否両論あると思いますが、正確な入力を可能とする堅実な作りになっています。

Xbox Oneのコントローラー(以下箱1コン)からの流れで、XSXコンも中央にあるXboxボタン(通称:シイタケボタン)が平べったくなっているのが若干悲しいです。Windows 8以降のフラットデザインに合わせるため、もしくは誤操作しにくくするためなのかもしれませんが、箱丸コンの立体的なデザインのXboxガイドボタンのほうが、オモチャ的な面白みがあってよかったですね。箱丸コンではガイドボタンの周囲に点滅・点灯する緑LED(リングライト)もあって楽しかったんですが、それも廃止されています。

※箱丸コンを知らない人は過去のレビュー記事でも見て想像してください。
www.4gamer.net

いざ接続

ちなみにASRockマザーのBluetoothアダプターを準備していたのは、このXboxワイヤレスコントローラーを使うためでした。

公式サイトのインストラクションに従ってWindows PCとペアリングできました。

コントローラーをペアリングモードにしておき、「Bluetooth またはその他のデバイスを追加する」で「Bluetooth」を選択してHIDデバイスの検出を開始するところがミソです。「その他すべて」の下には「Xbox コントローラーとワイヤレス アダプター、DLNA など」という説明があるんですが、ここで「その他すべて」を選択するとまったく検出されません。これはおそらく「Xbox ワイヤレス アダプター」(専用プロトコルによる独自通信方式)を搭載しているデバイス用の選択肢なので、一般的な汎用Bluetoothアダプターの場合は使えないっぽい。

しかし、接続が成功した直後に、以下のようなランタイムエラーダイアログが表示されてしまいました。

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Runtime Error!

Program: C...



This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.


---------------------------
OK   
---------------------------

これはどうやら、Xbox 360のコントローラーを使うために以前インストールしていた、「Microsoft Xbox 360 Accessories 1.2」が競合しているらしいです。今使っているWindows 10はWindows 8.1からアップグレードしたもので、確か2014年頃に "Xbox360_64Jpn.exe" を使ってインストールしていたはず。
Process Explorerでダイアログウィンドウの表示元プロセスを調べると、"C:\Program Files\Microsoft Xbox 360 Accessories\XBoxStat.exe" でした。おそらく新しいXboxコントローラーのデバイスドライバーと何らかの競合が起きて異常動作に陥り、プログラムがプロセスを強制終了するためにMSVCランタイムライブラリのabort()関数を呼ぶことでこのダイアログが表示されています。このダイアログ自体はWindows C/C++プログラマーにとってはお馴染みですね。

XBoxStat.exeはスタートアップに登録されており、OS起動時に毎回自動的に開始されるほか、「Microsoft Xbox 360 Accessories」配下の「Microsoft Xbox 360 Accessories ステータス」というショートカットから手動で起動することもできます。エラーダイアログを回避するために「Microsoft Xbox 360 Accessories 1.2」をアンインストールしてしまう手もありますが、とりあえず自分は「設定」→「アプリ」→「スタートアップ」でOFFにすることによって回避することにしました。

Steamの設定

Steamがインストールされている環境では、Xboxボタンを押すとデフォルトではSteamが起動したり、全画面のBig Pictureモードに遷移したりするようになっています。しかしXboxボタン長押しでコントローラーの電源を切りたいときや、ゲーム中に誤操作したときに邪魔なので、Steamの「設定」→「コントローラ」にて、「ガイドボタンでSteamを手前に表示」をOFF、「コントローラのガイドボタンコードを有効にする」をOFFにしておきます。
Steamによるフックを無効化すると、Xboxボタン押下でWindows標準のGame Barが起動するようになりますが、「設定」→「その他の設定」→「ショートカット」→「コントローラーの Xbox ボタンを使用して Game Bar を開きます」をOFFにするとGame Barが表示されなくなります。Game BarはWinキー+Gでも起動できるので、Xboxボタンによる起動は不要です。
Windows 10ではこれらの設定で解決できましたが、Windows 11ではXboxボタン長押しでタスクビューが表示されてしまうようです(Winキー+Tabと同じ)。Winキー全般を無効化することのできるレジストリ項目はあるものの、Winキー+LやWinキー+Mなどの普段使いたいショートカットもあるので却下。標準のOS設定画面で個別に有効/無効を切り替えることができればいいのに……

なお、Steamのゲーム(『Street Fighter 30th Anniversary Collection』や『Dead or Alive 5 Last Round』)で、XSXコンのボタンが正しく認識されない(アサインがバラバラになる)問題が発生しました。一応Windowsのコントロールパネル上ではすべてのボタンやトリガーが正しく認識されているので、ゲーム側の問題のようです。こういうときはSteam Inputを無効化すると改善されるという情報もありましたが、「XboxコントローラのSteam入力を有効にする」はOFFの状態でした。逆にこの設定をONにすると、ゲーム側でもほとんどのボタンが正常に認識されるようになりました。ただし、DOA5で右スティックが認識されないようです。

どうもBluetoothワイヤレス接続は問題が多いようなので、USB有線接続でやるしかないかも……と思っていましたが、ワイヤレスでも有線でもDOA5では右スティックが認識されない問題が発生します。DOA5では右スティックを使うことはほとんどないのですが、右スティックの押し込みボタンはコマンドトレーニングモードのお手本を見るなどの機能があります。

調査の結果、DOA5のSteam上のコントローラレイアウト設定の問題であることが分かりました。まずSteamクライアントの左ペインのゲームリストからDOA5を右クリック→「管理」→「コントローラレイアウト」で設定画面を開きます(もしくは右ペインのコントローラアイコンからもアクセス可能)。デフォルトでは開発元のTeam NINJAが作成した「Dead or Alive 5 Last Round の公式設定の公式レイアウト」が選択されていますが、これは「右ジョイスティック」の設定が空になってしまっていて、「ジョイスティック」「右スティッククリック」が使えません。テンプレートからValveが作成した標準の「ゲームパッド」を選択し、「レイアウトを適用」で問題が解消されました。なんで公式の設定にバグがあるのか……