こんにちは、阿久津です。Windows 8.1の一般向けリリースから数えて約半月、VL(ボリュームライセンス)から数えると約3カ月経ちましたが、セキュリティホール以外の問題がいくつか発見されました。その1つが本誌でも報じているマウス誤動作の問題です。

これまで大きく取り上げられることはありませんでしたが、特定のPCゲームにおいて、マウスポインターの遅延や応答不良などが発生するという不具合です。既にMicrosoftのナレッジベースにKB2908279として登録済みで、本トラブルが発生した理由として、"Windows 8.1はマウスに対して発した処理命令のレイテンシを低くするシナリオを想定していた"と説明しています。

タッチ環境を向上させるための処置かと思われますが、Microsoftは同じナレッジベース番号を持つ更新プログラムx64版はこちら)を適用することで、Call of DutyシリーズやDeus ExなどのFPSゲームで改善されることを明らかにしています。

中には「往年の~」という枕詞が似合うタイトルもありますが、Call of Duty: Black Ops IIのように2012年末にリリースされたタイトルが含まれていることを鑑みると、大きな問題と言えるでしょう。なお、本更新プログラムを適用することで、高DPI環境ではマウスポインターの位置が正しく計算されない問題や、タッチパッドおよびポインティングデバイスが応答しない問題も改善されるとのこと。

筆者はWindows 8.1にアップグレードしてから、PCゲームタイトルをインストールしておらず、ましてはFPSゲームを最後にプレイしたのも遙か昔。そのため、本トラブルに気付くことはありませんでしたが、いつの時代も開発者が予想しないような互換性問題が起こるものです。

他方でWindows 8.1と同じ時期にリリースされたOS X Mavericksは、一部の外付けHDDに格納したデータが消えてしまうトラブルが発生中です(本誌記事)。これに比べるとマウスの誤動作は可愛いものですが、Microsoftの早期対応を素直に評価すべきでしょう。

さて、前述のKB2908279には、更新プログラムで動作が改善するPCゲームタイトル以外でも同様の問題が発生した際に対応するレジストリエントリを用意していることがわかります。そこで今週は任意のPCゲームを互換モードで実行するチューニングをお届けしましょう。

1. 管理者権限でレジストリエディターを起動します。
2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layersキーを開きます(ない場合は作成します)。
3. PCゲームの実行ファイル名(フルパス)を持つ文字列値を作成します。
4. ステップ3で作成した文字列値のデータを「NoDTToDITMouseBatch」に変更します。
5. レジストリエディターを終了します。
6. 管理者権限でコマンドプロンプトを起動します。
7. 「Rundll32 apphelp.dll,ShimFlushCache」を実行します。
8. コマンドプロンプトを終了します。

これでチューニングが完了しました(図01~10)。

図01 [Win]+[R]キーを押して「ファイル名を指定して実行」を起動し、テキストボックスに「regedit」と入力して<OK>ボタンをクリックします

図02 レジストリエディターが起動したら、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlagsキーまで、キーをたどって開きます

図03 AppCompatFlagsキーを右クリックし、メニューから<新規>→<キー>とクリックします

図04 キー名を「新しいキー #1」から「Layers」に変更します

図05 Layersキーをクリックし、右ペインの何もないところを右クリックします。メニューから<新規>→<文字列値>とクリックしてください

図06 値名を「新しい値 #1」から、PCゲームの実行ファイル名(フルパス)に変更します

図07 文字列値をダブルクリックで開き、値のデータを「NoDTToDITMouseBatch」に変更して<OK>ボタンをクリックします

図08 <×>ボタンをクリックして、レジストリエディターを終了させます

図09 [Win]+[X]キーを押してクイックアクセスメニューを呼び出し、[A]キーを押して<コマンドプロンプト(管理者)>を選択します

図10 プロンプトに「Rundll32 apphelp.dll,ShimFlushCache」と入力して[Enter]キーを押してください。最後に<×>ボタンをクリックして、コマンドプロンプトを終了させます

早速結果を確認してみましょう。ステップ3で指定したPCゲームを起動し、マウスの動作を確認してください。画像では紹介できませんが、マウスポインターが意図するとおりに動けば成功です。そもそもAppCompatFlags\Layersキーは、プログラムの互換モード情報を格納するためのエントリ。Windows 7と互換性を持たせる場合は値のデータに「WIN8RTM」が加わる仕組みです。

システム全体に対して適用する場合は、HKEY_LOCAL_MACHINE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layersキーを使用し、サインインしたユーザーのみ適用する場合はHKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layersキーを使用してきました。ここに「NoDTToDITMouseBatch」を加えることで、マウスの動作をWindows 8以前と同じモードで動作させるのでしょう。

また、ステップ7~8では、「アプリケーションの互換性クライアントライブラリ」となるapphelp.dllに含まれるファンクション「ShimFlushCache」を実行し、データベースキャッシュをフラッシュさせています。この動作でシステムがエントリ内容を認識できるようにしているのでしょう。

なお、PCゲーム側がWindows 8.1に対応するなど、互換モード情報が不要になった場合はステップ3~4で作成した文字列値を削除し、ステップ7を再実行してください。

それでは、また次号でお目にかかりましょう。

阿久津良和(Cactus