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ファイルを生成できます。
これを
のようにコンパイルしてresファイルを生成します。
リソースDLLの作成
本来はさっきのresファイルをゲームの実行ファイルにリンクするのですが、実行ファイルを弄るわけにはいかないので、ここでは単独のDLLを作成することにします。
リソースのみのDLLなので、DllMain()も必要ありません。
Game Explorerへの登録
Game ExplorerもDirectXの慣習どおり、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ユーザーのアクセス権が必要