2010-09-01 110 views
7

我特别是指到Windows 7Windows 7的文件扩展名关联

我有一些代码,如下页上提出webJose一定的延伸与我的应用程序相关联: What registry keys are responsible for file extension association? (不过我正确写入HKEY_CURRENT_USER \ Software \ Classes而不是HKEY_CLASSES_ROOT)

上面的工作最初,或者如果没有其他程序与扩展关联。但是,在使用Windows 7内置的“选择默认程序...”(在“打开方式”下的文件右键上下文菜单下找到)后,它会将扩展程序与您选择的任何新程序重新关联。

此时发生的事情是系统更改了“HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \\ UserChoice”,因此新选择的程序会接管。

运行上面的代码,重新获得对扩展的控制将不起作用。恢复控制的唯一方法,是通过任一:

  1. 编辑UserChoice - >的Progid值,这是不允许的(既不编程也不使用regedit.exe - 拒绝访问)。
  2. 或者删除UserChoice值和下\ OpenWithList确保您的应用程序是在MRUList值第一(这可以实现使用regedit.exe但不是编程)

我的问题是:是否有办法以编程方式实现这一点?与其他程序关联后,可以更改哪些注册表值以重新获得对扩展的控制权?

我知道,如果通过资源管理器的用户将关联的应用程序设置为扩展名,那么可以预期再次以相同的方式重新将扩展名关联到不同的应用程序。

然而,问题是我的应用程序中有一个按钮,它使用上述代码来检查与我的应用程序的扩展关联。不幸的是,对于上述情况,我的应用程序会显示一条消息,确认该扩展在它不是时已经成功关联!那么有没有办法解决这个问题?

回答

4

删除UserChoice应该将默认程序还原为标准文件关联密钥(以HKCU中的ProgID开头)。除非你还可以删除OpenWithList,这将会带来极端的偏见。

编辑: 退房Registry Key Security and Access Rights MSDN上,特别是RegSetKeySecurity功能。请记住,在删除密钥之前,您需要授予自己对密钥的管理控制权。

+0

即使使用管理员写入,也无法以编程方式以任何方式删除密钥。这是我的上述问题的原因,我如何删除它? – Tamer 2010-09-02 08:32:12

+0

这是您系统的特点,而不是Windows标准。你安装的一些软件已经改变了密钥的ACL以防止你改变它......可能是在UserChoice下注册的任何软件。您应该可以授予自己访问权限,但是,请将其删除。 – 2010-09-02 13:08:52

+0

你可以证实吗?我现在已经在以管理员身份运行该应用程序的多台机器上尝试过了。以编程方式拒绝访问该特定键“UserChoice”(既不写也不删除)。你是否说你可以通过编程的方式在你的机器上编辑这个键的值?有人可以确认吗? – Tamer 2010-09-03 00:21:20

2

那么关于Window 7中的文件关联一个新的'问题'araised。

这是其中之一:你必须争取自己的权利。

假设你想运行

REG.exe DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mov\UserChoice" /f /va 

您就可以访问DENYED。 当您在Regedit'UserChoice'中检查密钥的安全设置时,您会看到为您设置了一个设置窗口,以拒绝当前用户的“设置”。那么你可以在regedit中更改/删除这个设置,现在你可以删除UserChoice。 但是,对于程序员/脚本编写人员来说,由于现在有真正的工具可以在注册表中设置ACL,所以设置有点琐碎。不过这里一些解决办法,在允许与ACCESS DENYED删除键(当然这仅适用于柜面你已经更改权限右):

ResetMovAssoc.cmd

::create 'empty.hiv' 
REG ADD "HKCU\emptyKey" /f 
REG SAVE "HKCU\emptyKey" empty.hiv /y 
@REG DELETE "HKCU\emptyKey" /f >nul 
::^-note you can add @[...] >nul to the other entries as well to run them quite 

:: Delete Reg key by replacing it with an empty hiv 
REG RESTORE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mov" empty.hiv 
del empty.hiv 

总结这个这里主要的事情是注册表恢复 +注册表配置单元文件包含只是和空的关键。 在Regedit这将等于导入与一个只是一个空的注册表结构文件(注意:这是一个配置单元文件,而不是* .reg文件)。