应用程序注册
本主题讨论应用程序如何公开启用某些方案所需的自身信息。 这包括查找应用程序所需的信息、应用程序支持的谓词以及应用程序可以处理的文件类型。
本主题的组织方式如下:
注意
还可以在设置程序访问和计算机默认值 (SPAD) 和设置默认程序 (SYDP) 控制面板应用程序中注册应用程序。 有关 SPAD 和 SYDP 应用程序注册的信息,请参阅 文件关联和默认程序指南和 设置程序访问和计算机默认值 (SPAD) 。
查找应用程序可执行文件
当在其 lpFile 参数中使用可执行文件的名称调用 ShellExecuteEx 时,函数可在多个位置查找该文件。 建议在 应用路径 注册表子项中注册应用程序。 这样做可避免应用程序修改系统 PATH 环境变量。
在以下位置中寻找该文件:
- 当前工作目录。
- Windows 目录仅 (不会) 搜索任何子目录。
- Windows\System32 目录。
- PATH 环境变量中列出的目录。
- 建议: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\应用路径
注册应用程序
应用路径和应用程序注册表子项都用于代表应用程序注册和控制系统的行为。 “应用路径”子项是首选位置。
使用“应用路径”子项
在 Windows 7 及更高版本中,我们强烈建议你按用户而不是按计算机安装应用程序。 为每个用户安装的应用程序可以在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\应用路径下注册。 可以为计算机的所有用户安装的应用程序可以在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\应用路径下注册。
在“应用路径”下找到的条目主要用于以下目的:
- 将应用程序的可执行文件名称映射到该文件的完全限定路径。
- 根据每个应用程序、每个进程预先将信息预写到 PATH 环境变量中。
如果 应用路径 的子项的名称与文件名匹配,则 Shell 将执行两项操作:
- (默认) 项用作文件的完全限定路径。
- 该子项的路径条目预先插入到该进程的 PATH 环境变量中。 如果这不是必需的,则可以省略 Path 值。
需要注意的潜在问题包括:
- Shell 将命令行的长度限制为MAX_PATH * 2 个字符。 如果有许多文件列为注册表项,或者其路径很长,则列表中后面的文件名可能会在命令行被截断时丢失。
- 某些应用程序不接受命令行中的多个文件名。
- 接受多个文件名的某些应用程序无法识别 Shell 提供这些文件名的格式。 Shell 将参数列表作为带引号的字符串提供,但某些应用程序可能需要不带引号的字符串。
- 并非所有可以拖动的项都是文件系统的一部分;例如打印机。 这些项没有标准 Win32 路径,因此无法向 ShellExecuteExecuteEx 提供有意义的 lpParameters 值。
使用 DropTarget 条目可避免这些潜在问题,方法是提供对所有剪贴板格式的访问权限,包括针对长文件列表 ) CFSTR_SHELLIDLIST (,以及针对 非文件系统对象) CFSTR_FILECONTENTS (。
使用“应用路径”子项注册和控制应用程序的行为:
将与可执行文件同名的子项添加到 “应用路径” 子项,如以下注册表项所示。
HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER SOFTWARE Microsoft Windows CurrentVersion App Paths file.exe (Default) DontUseDesktopChangeRouter DropTarget Path UseUrl
有关 应用路径 子项条目的详细信息,请参阅下表。
注册表项 | 详细信息 |
---|---|
(默认值) | 应用程序的完全限定路径。 (Default) 条目中提供的应用程序名称可以使用或不使用其 .exe 扩展名进行说明。 如有必要, ShellExecuteEx 函数 会在搜索 应用路径 子项时添加扩展。 条目属于 REG_SZ 类型。 |
DontUseDesktopChangeRouter | 调试程序应用程序在调试 Windows 资源管理器进程时必须避免文件对话框死锁。 但是,设置 DontUseDesktopChangeRouter 条目会稍微降低处理更改通知的效率。 条目属于 REG_DWORD 类型,值0x1。 |
DropTarget | CLSID) (类标识符。 DropTarget 条目包含对象的 CLSID, (通常是本地服务器,而不是实现 IDropTarget 的进程内服务器) 。 默认情况下,当放置目标是可执行文件,并且未提供 DropTarget 值时,Shell 会将放置的文件列表转换为命令行参数,并通过 lpParameters 将其传递给 ShellExecuteEx。 |
Path | 提供一个字符串 (以分号分隔的目录列表的形式,) 通过调用 ShellExecuteEx 启动应用程序时追加到 PATH 环境变量。 它是 .exe 的完全限定路径。 这是 REG_SZ。 在 Windows 7 及更高版本中,类型可以 REG_EXPAND_SZ,并且通常 REG_EXPAND_SZ %ProgramFiles%。
注意: 除了 Shell 识别 (默认) 、路径和 DropTarget 条目外,应用程序还可以向其可执行文件的 “应用路径” 子项添加自定义值。 我们鼓励应用程序开发人员使用 “应用路径” 子项来提供特定于应用程序的路径,而不是向全局系统路径添加内容。 |
SupportedProtocols | 创建一个字符串,其中包含给定密钥的 URL 协议方案。 这可以包含多个注册表值,以指示支持的方案。 此字符串遵循 scheme1:scheme2 的格式。 如果此列表不为空,则将 文件: 添加到字符串中。 定义 SupportedProtocols 时,隐式支持此协议。 |
UseUrl | 指示应用程序可以接受 URL (而不是命令行上) 文件名。 可直接从 Internet 打开文档的应用程序(如 Web 浏览器和媒体播放器)应设置此项。 当 ShellExecuteEx 函数启动应用程序且未设置 UseUrl=1 值时, ShellExecuteExecuteEx 会将文档下载到本地文件,并在本地副本上调用处理程序。 例如,如果应用程序设置了此项,并且用户右键单击存储在 Web 服务器上的文件,则 Open 谓词将可用。 否则,用户必须下载文件并打开本地副本。 UseUrl 条目的类型 REG_DWORD ,值为0x1。 在 Windows Vista 及更早版本中,此项指示通过 ShellExecuteEx 调用时,应将 URL 连同本地文件名一起传递给应用程序。 在 Windows 7 中,它指示应用程序可以理解传递给它的任何 http 或 https URL,而无需提供缓存文件名。 此注册表项与 SupportedProtocols 项相关联。 |
使用应用程序子项
通过在 HKEY_CLASSES_ROOT\Applications\ApplicationName.exe 子项下包含注册表项,应用程序可以提供下表中显示的特定于应用程序的信息。
注册表项 | 说明 |
---|---|
shell\verb | 提供用于从 OpenWith 调用应用程序的谓词方法。 如果未在此处指定谓词定义,系统将假定应用程序支持 CreateProcess,并在命令行上传递文件名。 此功能适用于所有谓词方法,包括 DropTarget、ExecuteCommand 和 Dynamic Data Exchange (DDE) 。 |
DefaultIcon | 允许应用程序提供特定图标来表示应用程序,而不是 .exe 文件中存储的第一个图标。 |
FriendlyAppName | 提供一种方法,用于获取要为应用程序显示的可本地化名称,而不仅仅是显示的版本信息(可能不可本地化)。 关联查询 ASSOCSTR 读取此注册表项值,并回退到版本信息中使用 FileDescription 名称。 如果缺少该名称,则关联查询默认为文件的显示名称。 应用程序应使用 ASSOCSTR_FRIENDLYAPPNAME 来检索此信息以获取正确的行为。 |
SupportedTypes | 列出应用程序支持的文件类型。 这样做可使应用程序在“ 使用打开 ”对话框的级联菜单中列出。 |
NoOpenWith | 指示未指定用于打开此文件类型的应用程序。 请注意,如果已按文件类型为应用程序设置了 OpenWithProgIDs 子项,并且 ProgID 子项本身也没有 NoOpenWith 条目,则即使它已指定 NoOpenWith 条目,该应用程序也会显示在推荐或可用应用程序列表中。 有关详细信息,请参阅 How to How to Include an Application in the Open With Dialog Box 和 How to exclude an Application from the Open With Dialog Box。 |
IsHostApp | 指示进程是主机进程,例如 Rundll32.exe 或 Dllhost.exe,不应考虑将 “开始” 菜单固定或包含在“最常用的 (MFU) 列表中。 当使用包含非 null 参数列表的快捷方式或显式 应用程序用户模型 ID (AppUserModelIDs) 启动时,可以将进程固定 (作为该快捷方式) 。 此类快捷方式是包含在 MFU 列表中的候选项。 |
NoStartPage | 指示应用程序可执行文件和快捷方式应从 “开始 ”菜单和固定或包含在 MFU 列表中排除。 此项通常用于排除系统工具、安装程序和卸载程序以及自述文件。 |
UseExecutableForTaskbarGroupIcon | 如果此应用程序没有可固定的快捷方式,则会导致任务栏使用此可执行文件的默认图标,而不是第一次遇到窗口的图标。 |
TaskbarGroupIcon | 指定用于替代任务栏图标的图标。 窗口图标通常用于任务栏。 设置 TaskbarGroupIcon 条目会导致系统改用应用程序 .exe 中的图标。 |
示例
通过 HKEY_CLASSES_ROOT\ 应用程序ApplicationName.exe 子项注册应用程序的\一些示例如下所示。 所有注册表项值都是REG_SZ类型,除默认类型为REG_EXPAND_SZ。
HKEY_CLASSES_ROOT
Applications
wordpad.exe
FriendlyAppName = @%SystemRoot%\System32\shell32.dll,-22069
HKEY_CLASSES_ROOT
Applications
wmplayer.exe
SupportedTypes
.3gp2
HKEY_CLASSES_ROOT
Applications
wmplayer.exe
DefaultIcon
(Default) = %SystemRoot%\system32\wmploc.dll,-730
HKEY_CLASSES_ROOT
Applications
WScript.exe
NoOpenWith
HKEY_CLASSES_ROOT
Applications
photoviewer.dll
shell
open
DropTarget
Clsid = {FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}
HKEY_CLASSES_ROOT
Applications
mspaint.exe
SupportedTypes
.bmp
.dib
.rle
.jpg
.jpeg
.jpe
.jfif
.gif
.emf
.wmf
.tif
.tiff
.png
.ico
注册谓词和其他文件关联信息
在 HKEY_CLASSES_ROOT\SystemFileAssociations 下注册的子项使 Shell 能够定义文件类型属性的默认行为并启用共享文件关联。 当用户更改文件类型的默认应用程序时,新默认应用程序的 ProgID 优先提供谓词和其他关联信息。 此优先级是由于它是关联数组中的第一个条目。 如果更改了默认程序,则以前的 ProgID 下的信息将不再可用。
若要主动处理更改默认程序的后果,可以使用 HKEY_CLASSES_ROOT\SystemFileAssociations 来注册谓词和其他关联信息。 由于它们在关联数组中 ProgID 之后的位置,因此这些注册的优先级较低。 即使用户更改默认程序,这些 SystemFileAssociationsregistration 也是稳定的,并提供用于注册辅助谓词的位置,该谓词将始终可用于特定文件类型。 有关注册表示例,请参阅本主题后面的 注册感知类型 。
以下注册表示例演示当用户在 控制面板 中运行“默认程序”项,将 .mp3 文件的默认值更改为 App2ProgID 时会发生什么情况。 更改默认值后,Verb1 不再可用,Verb2 将成为默认值。
HKEY_CLASSES_ROOT
.mp3
(Default) = App1ProgID
HKEY_CLASSES_ROOT
App1ProgID
shell
Verb1
HKEY_CLASSES_ROOT
App2ProgID
shell
Verb2
注册感知类型
感知类型的注册表值定义为 HKEY_CLASSES_ROOT\SystemFileAssociations 注册表子项的子项。 例如,可感知的类型 文本 注册如下:
HKEY_CLASSES_ROOT
SystemFileAssociations
text
shell
edit
command
(Default) = "%SystemRoot%\system32\NOTEPAD.EXE" "%1"
open
command
(Default) = "%SystemRoot%\system32\NOTEPAD.EXE" "%1"
通过在文件类型的子项中包含一个 PerceivedType 值来指示文件类型的感知类型。 “感知类型”值设置为 在 HKEY_CLASSES_ROOT\SystemFileAssociations 注册表子项下注册的感知类型的名称,如前面的注册表示例所示。 例如,若要将 .cpp 文件声明为感知类型“text”,请添加以下注册表项:
HKEY_CLASSES_ROOT
.cpp
PerceivedType = text