[Windows]在Win7游戏管理器中添加游戏

Win7的游戏浏览器是一个不错的特性,它不仅可以显示游戏的完整信息,更重要的是可以开辟一个新的空间,将众多的游戏集中到一起,整整有条。不过这个游戏浏览器有一个很大的缺点,它只支持微软预定义游戏列表中的游戏,在这些游戏第一次启动时,Win7会自动把这些游戏添加到游戏浏览器中。而对于那些不在列表中的游戏,需要手动将游戏的可执行文件拖动到游戏浏览器中进行添加。也许这不是问题,但是手动添加的游戏在游戏浏览器中只能显示少得可怜的信息:一个小小的图标,以及上一次玩的时间。对于游戏封面、开发商、发行商、发行年份、分级等信息,统统没有显示。更要命的是,有些游戏在游戏浏览器中是不能启动的。鉴于以上的原因,Win7的游戏浏览器成了不折不扣的“鸡肋”。

 

不过希望还是有的,根据本文的指导,你可以往游戏浏览器中添加任意的程序(注意不仅仅是游戏),任意指定这些程序的封面图片,任意指定程序的信息(包括分级信息)。下面我们就开始添加第一个游戏吧!

 

添加游戏图标

也许你已经想到了,游戏浏览器中的游戏信息大部分都是储存在注册表中的。运行regedit,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX,这里就是游戏信息的存放位置了。在该项下面会有一个或者多个形如S-1-5-21-2991516018-3788628002-2267702491-1000的子项,这样的字符串称为SIDSecurity Identity),用于唯一标识一个用户的身份。子项个数的多少取决于你当前系统中有多少个用户,一个子项对应一个用户。展开其中一个子项,又会看到有多个形如{0977ee99-ef58-4436-85b4-814967efb163}的子项,这样的字符串称为GUIDGlobal Unique Identity),每一个这样的子项对应一个游戏的信息。一个SID项下有多少个GUID子项,这个SID项对应的用户打开游戏浏览器时就可以看到多少个游戏,各个用户之间的游戏是不相通的。

 

如果你的GameUX项下没有任何子项,那说明你的游戏浏览器中还没有添加过任何游戏。这时可以手动新建这些子项。首先要获得当前用户的SID,运行cmd,执行whoami  /user命令即可获得SID,然后在GameUX项上右击,选择“新建-项”,再将新的项命名为刚才获得的SID即可。

 

下面开始添加第一个游戏。首先要获得一个新的GUID,如果你安装了VS,那可以使用它自带的“GUID生成器”来生成;如果没有则可以搜索下载一个GUID生成器;再不然可以利用Win7自带的PowerShell来生成,方法如下:运行PowerShell,执行[Guid]::NewGuid()命令即可获得一个新的GUID。获得GUID之后,右击代表当前用户的SID项,选择“新建-项”,将其命名为获得的GUID,注意要用花括号括起来。

 

接着点击新建的子项,在右侧窗口按照以下表格添加值(以下数据作为示例):

名称

类型

数据

说明

AppExePath

REG_SZ

F:\使命召唤5\CoDWaW.exe

游戏可执行文件的路径

ConfigApplicationPath

REG_SZ

F:\使命召唤5

游戏所在目录的路径

Description

REG_SZ

使命召唤5

游戏的描述

DeveloperName

REG_SZ

Treyarch

游戏开发商名称

DeveloperUrl

REG_SZ

http://www.treyarch.com/

游戏开发商主页地址,需要以http://开头

Genre

REG_SZ

第一人称射击

游戏流派

HomePage

REG_SZ

http://www.treyarch.com/

游戏主页地址,需要以http://开头

PublisherName

REG_SZ

Activision

游戏发行商名称

PublisherUrl

REG_SZ

http://www.activision.com/

游戏发行商主页地址,需要以http://开头

ReleaseCountry

REG_SZ

美国

游戏发行国家

ReleaseDate

REG_SZ

2008-11-11

游戏发行日期,以YYYY-MM-DD格式表示

Title

REG_SZ

使命召唤5

游戏标题,显示在图标旁边的文字

 

添加完成后打开游戏浏览器(如果已经打开了则刷新一下),可以发现多了一个使命召唤5的图标,点击该图标,在右侧的窗栏中可以看到一副使命召唤5的图片,这是因为使命召唤5的可执行文件CoDWaW.exe中已经包含了一副图片,游戏浏览器将它读取并显示出来了。当然,如果你添加的游戏的可执行文件中不包含图片,那么右侧窗栏中显示的仅仅是一个小小的图标。由此可以知道AppExePath的作用是提供可执行文件的路径,从中读取图标。

 

显示完整信息

你已经注意到了,除了这个新添加的图标以及或有或无的图片之外,其余的信息都没有出现。要使全部的信息都显示出来,还需要在上述的游戏GUID子项中添加以下的信息:

名称

类型

数据

ConfigInstallType

REG_SZ

3

ApplicationId

REG_SZ

{00462F9A-98FB-4A7A-B7B4-EF2E70514E4F}

ConfigGDFBinaryPath

REG_SZ

C:\Windows\system32\GameUXLegacyGDFs.dll

 

添加完之后回到游戏浏览器中刷新一下,所有的信息都出来了,甚至还包括产品版本和游戏分级这些我们没有添加过的信息。那些刚添加的这三个值有什么用呢?首先来看看ConfigGDFBinaryPath,本文的开头说过,游戏浏览器中只能完整支持预定义游戏列表中的游戏,这个预定义游戏列表存放的地方就是在C:\Windows\system32\GameUXLegacyGDFs.dll这个文件中。如果用ExeScope等资源查看软件打开这个文件,会发现该文件的资源中包含非常多的以GUID命名的项,每一项的内容都是以XML描述的游戏部分信息,这些信息主要包括:游戏名称,版本信息和分级信息,另外还有一些信息指明可以从哪里下载到游戏的完整信息,注意这里说的是“下载”,后文会说明这里的完整信息与我们在注册表中添加的信息有何不同。

 

看到这一大堆的GUID列表,我们很容易猜想刚才添加的ApplictaionId的值是跟这些GUID中的一个匹配的。确实如此,只有ApplicationId的值在GameUXLegacyGDFs.dll中有对应的项,游戏浏览器才会显示这个游戏的完整信息。现在应该明白了:我们通过ApplicationId来告诉游戏浏览器,这是一个预定义游戏列表中的游戏,然后游戏浏览器就会受骗上当,显示出完整的游戏信息,也就是我们在注册表中添加的信息,以及GameUXLegacyGDFs.dll中定义的版本和分级信息。

 

由于版本和分级信息是保存在GameUXLegacyGDFs.dll中的,我们不能很容易地修改,所以如果要想给自己添加的游戏指定版本和分级信息,就要指定不同的ApplicationId。版本信息基本上都是1.0.0.0的,所以下面只列出ESRB分级系统中各等级相应游戏的ApplicationId

等级

ApplicationId

EarlyChildhood 3+

{b5eef1e4-c4b6-4265-9169-0d753f0790eb}

Everyone 6+

{00462F9A-98FB-4A7A-B7B4-EF2E70514E4F}

Everyone 10+

{66408a98-d9e6-422d-aa49-bf87fb2dac8a}

Teen 13+

{005ACBAB-3521-4EDA-8FC0-D926DD3053F8}

Mature 17+

{a978f4e9-dbc2-4da7-98b6-3881941afee2}

AdultsOnly 18+

{748eedd0-3996-4d53-bb39-b6c87bd25035}

 

可以将ApplicationId设为不同的值来验证上表的正确性。然而你会发现即使更改了ApplicationId并刷新游戏浏览器,游戏的分级信息并不会改变。这并不是我错了,而是要先关闭游戏浏览器,再重新打开,此时分级信息才会改变。我猜想可能是因为游戏浏览器将分级信息缓存起来了,这样只需要读取一次文件即可,避免了频繁的文件访问,提高了性能。

 

最后还有一个ConfigInstallType没有解释。在游戏浏览器中的游戏可以分为几类:预定义游戏列表中的游戏,扫雷、纸牌等Windows自带的游戏,还有通过正常手段添加的游戏(即通过拖曳游戏图标到游戏浏览器中)。ConfigInstallType正是用来区分这几类游戏的,根据ConfigInstallType的值,游戏浏览器会通过不同的途径去获取游戏信息并显示。ConfigInstallType的取值和对应的游戏类型如下表所示:

ConfigInstallType

游戏类型

显示的信息

1

Windows自带的游戏

完整信息

2

未知

标题、发行商、版本

3

预定义游戏列表中的游戏

完整信息

4

通过正常手段添加的游戏

图标、标题

 

显然,只有ConfigInstallType的值为3时才能符合我们的需要。至于值为2时表示什么意思,我还没有搞清楚。

 

上文的所有修改我都是在脱机状态下进行的。而正在阅读本文并按步骤操作的你肯定会发现:在多次(次数的多少取决于你的网络状况)刷新游戏浏览器之后,自己添加的游戏的信息变成了另一个游戏的信息!除了游戏图标之外,标题、开发商、发行商等无一幸免,甚至还多了一张封面图片。显然,这些游戏的信息正是我们在ApplicationId中指定的游戏的。这是因为游戏浏览器会自动通过网络更新游戏的信息。上文说过GameUXLegacyGDFs.dll中的每一个游戏都保存了一些信息,这些信息指明从哪里可以下载到游戏的完整信息,游戏浏览器正是通过这些信息从网络上更新游戏信息的。这个特性可以保证游戏浏览器中的游戏都保持在最新的状态,非常不错——但仅仅是对那些预定义游戏列表中的游戏。对于我们自己添加的游戏来讲,这个特性无疑让我们的计划泡汤了。

 

解决方法肯定是有的,不然就不会产生本文了。游戏浏览器并不是每时每刻都在更新,而是有一个时间周期的。再次打开注册表,打开保存游戏信息的GUID子项,会看到多了两个值:TimeToRefreshBasicDataTimeToRefreshBoxArt,根据名字可以很容易猜想到这两个值分别定义了何时更新游戏信息和游戏封面图片。如果游戏浏览器在注册表中没有发现这两个值,就会立即进行更新,然后建立这两个值,并设为一个星期之后的日期,以后每次更新都会将它们的值顺延一个星期。就是它们了!由于这两个值使用了FileTime格式来表示时间,不容易修改,这里再次使用PowerShell来帮助我们获取一个表示99991231125959秒的FileTime数值:打开PowerShell,执行[DateTime]::MaxValue.ToFileTime()命令,即可得到一个数值,将TimeToRefreshBasicDataTimeToRefreshBoxArt的值修改为该数值即可,修改时要注意该值是用十进制表示的。将注册表中的信息重新修改一次,这样它永远都不会变了。

 

添加游戏封面图片

信息是修改过来了,但是游戏封面的图片仍然是先前那个游戏的,现在讲一下如何为游戏添加封面图片。

 

游戏封面图片文件存放在C:\Users\用户名\AppData\Local\Microsoft\Windows\GameExplorer\GamesBoxArt文件夹下,格式为jpg。文件名要与注册表中游戏的GUID子项名称相同,例如{0977ee99-ef58-4436-85b4-814967efb163}.jpg。游戏浏览器会自动在该文件夹下寻找匹配的图片文件。除了在这个位置添加图片文件以外,还要在注册表的游戏GUID子项中添加一个新的值:打开注册表中游戏GUID子项,在右侧窗口中新建一个REG_SZ类型的值,名为BoxArt,将它的值设置为一个图片文件的URL(完整路径或网址均可)。有意思的是,这个图片文件路径可以随意指定,即使指定一个不存在的文件路径也行,但一定要是JPG格式的,而且路径必须是合法的。

 

所以,为游戏添加封面图片要做的就是在特定的文件夹下添加图片文件,然后在游戏GUID子项中添加BoxArt值。还有另外一种添加封面图片的方法,不需要复制图片文件:只要将BoxArt的值设为一个存在的JPG文件路径即可。这样游戏浏览器在检测到游戏没有封面图片时,会从BoxArt指定的URL获取图片文件,存放到上述文件夹中,并且重命名为正确的名称。

 

经过上面一系列的修改,我们添加的游戏就像预定义游戏列表中的游戏一样,可以显示完整的信息了。然而这个新添加的游戏似乎是死的,无论双击还是右击该图标,都没有一点反应。这是因为我们还没有为这个游戏在特定的文件夹下添加快捷方式。关于如何添加快捷方式,请继续往下看。

 

添加游戏快捷方式

即使我们在注册表中添加了AppExePath并指定了游戏的可执行文件路径,我们仍然不能启动这个游戏,因为游戏浏览器并不是读取这个值来启动游戏的,而是通过特定文件夹下的快捷方式。这个特定的文件夹是C:\Users\用户名\AppData\Local\Microsoft\Windows\GameExplorer。在该文件夹下新建一个文件夹,新文件夹的名称要与在注册表中游戏的GUID子项名称完全相同,例如,如果GUID子项为{D317C0E4-A910-47fd-8767-615303EDCCD2},那么这个文件夹的名称也要是{D317C0E4-A910-47fd-8767-615303EDCCD2}。正是通过这个GUID,将注册表中的游戏信息与这个文件夹中的快捷方式联系起来。

 

仅仅建立了这个文件夹还不够。进入该文件夹,再新建一个文件夹,命名为PlayTasks。进入PlayTasks文件夹,再建立一个名为0的文件夹(注意是数字0,而不是字母O),此时就可以将游戏的快捷方式添加到这个名为0的文件夹下了。首先打开游戏所在的文件夹,右击游戏的可执行文件,点击“创建快捷方式”,然后将这个快捷方式剪切粘贴到0文件夹下,重命名为Play即可。

 

本文的开头说过,有些通过正常途径添加到游戏浏览器中的游戏是不能启动的,这是因为游戏快捷方式的工作文件夹没有正确设置的原因。右击快捷方式,选择“属性”,定位到“快捷方式”选项卡,在这里有一个“起始位置”的文本框,文本框中的值应该是游戏可执行文件所在文件夹的完整路径。而通过正常途径添加进来的游戏的快捷方式,这个文本框中的值都是快捷方式所在文件夹的路径,这就造成了很多游戏不能运行。

 

总结

在游戏浏览器中添加游戏所要做的事情都已经完成了,我们的游戏可以显示完整的信息,并可以运行了。不过毕竟我们添加游戏是通过假借另一个游戏的身份来欺骗游戏浏览器实现的,因此不可能得到游戏浏览器的完整支持,例如联机检查更新。在游戏浏览器中添加游戏本来是游戏开发商做的事情。顺便说一下,之所以要在注册表的游戏GUID子里使用ApplicationIdConfigGDFBinaryPath这两个值,我想很有可能是因为这样可以方便游戏开发商在游戏浏览器中添加游戏,游戏开发商只要开发一个DLL文件,这个文件的格式与GameUXLegacyGDFs.dll格式一致,并利用ApplicationId来引用这个DLL文件中的游戏信息,就可以像预定义游戏列表中的游戏一样得到游戏浏览器的完整支持。

 

这里简单总结一下添加一个游戏的步骤:

1.生成一个游戏的GUID值。

2.在注册表中添加一个代表游戏的GUID子项,并添加游戏的相关信息。

3.将游戏封面图片复制到特定目录下,重命名为游戏的GUID值。

4.将游戏快捷方式复制到特定目录下,重命名为play

 

看起来很简单,实际上要做的事情很多,很繁琐。为了添加一个游戏而大动干戈,这是任何人都不愿意的,因此,我根据本文的内容开发了一个小软件,用于在管理游戏浏览器中的游戏,将一切操作都自动化。下载地址为:

https://files.cnblogs.com/zplutor/Win7%e6%b8%b8%e6%88%8f%e7%ae%a1%e7%90%86%e5%99%a81.0%e4%bf%ae%e6%ad%a3%e7%89%88.rar

原文地址:https://www.cnblogs.com/zplutor/p/1704821.html