Game Explorerに未対応ゲームを勝手に登録する

Windows Vistaにはスタートメニューに「ゲーム」という項目があり、Vista対応ゲームをインストールするとココにアイコンが追加されるようになっています。
Vista未対応のゲームでも、実行ファイルかショートカットをドラッグ&ドロップすることで追加することはできます。
ただし、この場合、

  • 実行ファイルのアイコンがそのまま表示されて格好悪い
  • タイトル以外の項目が表示されなくて寂しい

といった制限があります。


この「ゲーム」フォルダはGame Explorerと呼ばれていて、DirectXの一部という扱いになっています。
DirectXのドキュメントを読む限り、未対応ゲームでも簡単に対応できそうだったのでやってみました。

Game Definition Fileの作成

まず、ゲームのタイトルやパッケージイラストの情報をGame Definition File(GDF)にまとめます。
GDFファイルはXMLベースのファイルなので手書きでもいいのですが、ドキュメントが不完全で詳細が不明な箇所も多いため、専用のエディタを使ったほうが楽です。
DirectX SDKには、Game Definition File Editorというものが付いているのでこれを使います。
メニューの[Preview]でプレビュー表示も可能です。

リソースファイルの生成

出来上がったGDFファイルは実行ファイルかDLLにリソースとして埋め込む必要があります。
GDF Editorのメニューから、[Resources]-[Build Script for Project]を選択すると、rcファイルを生成できます。
これを

rc /i"%DXSDK_DIR%\Include" /fo"hoge.res" hoge.rc

のようにコンパイルしてresファイルを生成します。

リソースDLLの作成

本来はさっきのresファイルをゲームの実行ファイルにリンクするのですが、実行ファイルを弄るわけにはいかないので、ここでは単独のDLLを作成することにします。

cl /Fe"hoge.dll" hoge.res /link /DLL /NOENTRY

リソースのみのDLLなので、DllMain()も必要ありません。

Game Explorerへの登録

Game ExplorerDirectXの慣習どおり、COMを使って操作します。
CoCreateInstance()などでGameExplorerオブジェクトを生成してIGameExplorerインタフェースを取得したら、ゲームのパスとGDFファイルを含む実行ファイルを指定してAddGame()メソッドを呼びます。
これでGame Explorerにアイコンが追加されます。
AddGame()から返されるGUIDがこのゲームインスタンスのIDになります。

タスクの追加

まだ、このままではアイコンをダブルクリックしてもゲームは起動しません。
Game Explorerには実行ファイルがどれなのか分からないからです。
コンテキストメニューを見ても、「プレイ」が見当たらないはずです。


ここにメニューを追加するには、GameTasksと呼ばれる特別なフォルダにゲームインスタンスのGUID文字列でフォルダを作成し、さらに「PlayTasks」、「0」とフォルダを掘って、「プレイ.lnk」のような名前でショットカットを作成します。
「PlayTasks」には連番でフォルダを追加してもいいですし、「SupportTasks」フォルダも使えます。


この作業は普通インストーラーが行うことですが、手作業でも可能ですし、Game Explorerコンテキストメニューから「カスタマイズ」を選べばユーザーが自由に編集もできます。

できあがり

さて、これで作業も完了したわけですが、実際にGame Explorerで見ると、本物と微妙に違うのが分かります。

  • 「発行元」、「開発者」のリンクが無効になっている
  • レーティング情報が反映されない
  • 「SupportTasks」が反映されない
  • 「保存したゲーム」(セーブデータ置き場)のメニューが反映されない(2/8追記: Default Game Folderなら動きました)

レジストリの「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX\Games」を見てみると、本物はIsSignedの値が0になっていて、これが原因な気がします。
おそらく何かにデジタル署名するか、どこかに届け出ない限り有効にはならないのでしょう。
GDF EditorのマニュアルにGDFのDLL/EXEに署名しないとダメだと書いてありました。
レーティング情報を偽れたら問題なので、当然といえば当然です。
まぁ、雰囲気だけで我慢するとします。


一応、ソースを置いときます。「空の軌跡SC」用です。
http://www12.ocn.ne.jp/~dante98/src/AddGame.cpp


(2/8 追記)

  • GDFのDLL/EXEはゲームのフォルダ配下に置かないとエラーになる
  • ゲームのフォルダにはAdministratorユーザーのアクセス権が必要