在 Windows 注册表中,“LegacyDisable”字符串值是什么?它究竟有什么作用?

Has*_*ziz 9 windows windows-registry windows-7 context-menu regedit

在 Windows 注册表中,将LegacyDisable字符串值添加到键的目的是指示 Windows 忽略键、其值及其任何子键和子值,从而有效地禁用它。

例如,将LegacyDisable字符串值添加到以下键:

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\opennewwindow
Run Code Online (Sandbox Code Playgroud)

...禁用opennewwindow,从 Windows 资源管理器的上下文菜单中删除“在新窗口中打开”项。CCleaner的上下文菜单清理工具也LegacyDisable用于此目的。

但是,关于字符串值的文档似乎不存在;我根本无法找到任何记录它的内容,无论是在这里还是通过 Google,所以我对它的来源感到困惑,是否禁用注册表项就是它的全部目的,以及为什么它没有记录.

禁用注册表项LegacyDisable的唯一目的是什么?

当用于禁用注册表项时,它的行为与 CCleaner 使用的其他方法有何不同 - 将纯文本添加到字符串值的十六进制数据?为什么 CCleaner 使用这两种方法?

har*_*ymc 6

我在 LegacyDisable 上做了一些调查工作,我将在下面详细介绍。

Microsoft 在Verbs and File Associations - Registering Verbs for Backward Compatibility 一文中记录了此方法 :

某些应用程序可能会在注册表中搜索不再使用的动词键。为此,可以将这些键保留在注册表中,并将 LegacyDisable 值添加到动词的键中,这会告诉系统该动词不是实际的动词,而存在只是为了向后兼容。

此处显示了 LegacyDisable 值的使用。该值只需要存在;它可以是任何值类型(尽管 REG_NONE 最合适)并且不需要任何数据与之关联。如果数据存在,则将其忽略。

* KEY_CLASSES_ROOT
  *  Application
    *   shell
       *  open
            (Default) = &Open
            LegacyDisable
            *  command
                (Default) = command line 
Run Code Online (Sandbox Code Playgroud)

LegacyDisable 的使用似乎仅限于禁用 shell 上下文动词,因为它始终仅在此上下文中描述。

此方法由实用程序ShellMenuView使用,其中显示“Windows 98 不支持此注册表项”,因此它似乎起源于 Windows NT。

我在两本书中发现了这种方法:

  • Windows 7 烦恼 (2010),第 179 页:

看到要删除的上下文菜单项吗?只需删除相应的操作键(例如,新建、打开、打印),它就会立即消失。更好的是,将名为 LegacyDisable 的字符串值添加到键中以将其隐藏在 Windows 资源管理器中,而无需删除任何内容。

  • Windows 注册表故障排除,第 100 页

在这些位置下,您将看到已插入上下文菜单的第三方软件的子项。有几种方法可以处理它们。您可以删除密钥以完全删除它们。要强制它们仅在 Shift+右键单击时显示,请为每个名为“Extended”的字符串添加一个值,或者将它们保留在注册表中但禁用它们,请添加一个名为“LegacyDisable”的字符串值。

我认为这就是可以为 LegacyDisable 找到的所有有用信息。

至于为什么CCleaner采用这种方法和另一种销毁密钥的方法,我只能做出两个猜想:

  1. 代码是由两个不同的程序员编写的,其中一个不知道 LegacyDisable
  2. 密钥销毁方法用于 LegacyDisable 不起作用的情况(不是 shell 上下文动词)。