如何从未关联文件类型的“打开方式”对话框中排除应用程序

当用户尝试打开的文件不是任何已注册文件类型的成员 (即未知文件类型) ,或者当用户从文件的快捷菜单中选择“ 打开方式 ”或“ 打开方式 -> 选择默认程序 ”时,Shell 会显示一个子菜单或对话框,使用户能够指定用于打开该文件的程序。

默认情况下,注册为\HKEY_CLASSES_ROOT应用程序”子项的任何应用程序都显示在“打开方式”对话框中。 无论应用程序是否已注册以处理文件类型,这些应用程序都以 Open 形式显示。

若要防止当应用程序不应或不能用于打开某些文件类型时,应用程序出现在“ 打开方式 ”对话框中,请使用本主题中所述的两种技术之一。

Instructions

步骤 1:

将 NoOpenWith 条目添加到应用程序的子项。 当应用程序使用文件类型时,Windows 会记录该信息以生成 “推荐的程序” 列表。 此列表显示在 “打开方式 ”子菜单,如以下屏幕截图所示。

快捷菜单的屏幕截图,其中显示了“打开”子菜单

这些推荐的应用程序也显示在“打开时”对话框的“推荐程序”部分,如以下屏幕截图所示。

带有推荐程序的“打开时”对话框的屏幕截图

注意

如果应用程序已在文件类型的 OpenWithList 或 OpenWithProgID 中注册了自身,即使设置了 NoOpenWith 条目,它也会显示在 “建议的程序” 列表中。 此外,请记住,无论应用程序是否在推荐程序列表中提供,用户都可以手动浏览到任何可执行文件。

 

应用程序可以通过在应用程序的子项下指定 NoOpenWith 值来禁用此跟踪。

NoOpenWith 条目是空 REG_SZ 值,如以下示例所示。

HKEY_CLASSES_ROOT
   Applications
      MyProgram.exe
         NoOpenWith

设置 NoOpenWith 条目也有以下效果:

  • 防止通过拖放将文件固定到应用程序的跳转列表,除非应用程序专门注册以处理该文件类型。
  • 阻止通用文件对话框和对 SHAddToRecentDocs 函数的任何调用将任何文件添加到应用程序的跳转列表,除非应用程序专门注册以处理该文件类型。

步骤 2:

防止应用程序显示在“ 打开方式 ”对话框中的第二种方法是使用 SupportedTypes 子项显式列出应用程序可以打开的文件类型的扩展名。 这可以防止应用程序出现在无法打开的文件类型的“ 打开时 ”对话框中。 它还会导致应用程序显示在前面讨论的 “推荐程序” 列表中。

如果应用程序可以将文件保存为某种文件类型,但无法打开该文件类型,则此方法特别有用。 调用“保存”对话框时,应用程序还应通过 IFileDialog::SetOptions 设置FOS_DONTADDTORECENT标志。 这可以防止项目添加到跳转列表的 “最近” 或“ 常用 ”部分。 它还阻止在 OpenWithList 下跟踪应用程序。

每个受支持的扩展都作为一个条目添加到 SupportedTypes 子项下,如以下示例所示。 条目的类型为 REG_SZREG_NULL,没有关联的值。

HKEY_CLASSES_ROOT
   Applications
      ApplicationName
         SupportedTypes
            .ext1
            .ext2
            .ext3

如果提供了 SupportedTypes 子项,则只有具有这些扩展名的文件才有资格固定到应用程序的跳转列表或在应用程序的 最近常用 目标列表中进行跟踪。

NoOpenWith 条目替代 SupportedTypes 子项,并在 “打开时 打开”对话框中隐藏应用程序。