仅针对特定文件类型将菜单项添加到 Windows 上下文菜单

Posted

技术标签:

【中文标题】仅针对特定文件类型将菜单项添加到 Windows 上下文菜单【英文标题】:Add menu item to Windows context menu only for specific filetype 【发布时间】:2011-01-08 14:06:34 【问题描述】:

我开发了一个应用程序,它使用窗口的上下文菜单加载图像(右键单击文件)并且目前正在工作,但 reg 键是打开的

HKEY_CLASSES_ROOT\*

它适用于所有文件。

我希望上下文菜单上的菜单项应仅与 .jpg 文件一起显示。

我该怎么做?我应该使用哪些注册表项?

【问题讨论】:

【参考方案1】:

    识别 .jpg 文件的文件类型 (ProgID)

    这可以通过检查HKEY_CLASSES_ROOT\.jpg 的默认值来完成。根据您安装的内容,它可以是任何东西,但出于本示例的目的,我们将其称为 jpegfile,这是一个常见的默认值。

    为该文件类型设置上下文菜单项(动词)属性

    您可以在HKEY_CURRENT_USER\Software\Classes\jpegfile\shell 中设置每个用户的上下文菜单项。此键具有文件类型的动词列表。 HKEY_LOCAL_MACHINE\Software\Classes\jpegfile\shell 中有一个类似的键,这些是文件类型的系统默认值。你也可以在那里放一个动词键,但如果 HKCU 中存在相同的键,它将被覆盖,所以请注意。

    设置指令值

    需要设置以使其工作的最小键值是command 子键的默认值。您需要使用应用程序的路径进行设置,如下所示:HKEY_CURRENT_USER\Software\Classes\jpegfile\shell\open_with_myapp\command 将设置为 "c:\path\to\myapp.exe" "%1"。现在 .jpg 文件的上下文菜单将有一个“open_with_myapp”项,单击该项将启动您的应用程序,并将所选文件的文件名作为参数传递。当然,您的应用程序如何处理参数取决于您,因此您需要将参数字符串设置为您的应用程序可以处理的内容。

    设置其他动词属性

    我想您可能希望上下文菜单项读取比键名更友好的内容。您可以通过设置该键的默认值 (open_with_myapp) 让上下文菜单显示您想要的项目标签。

这是您的基本概述。一定要看看我对这个关于关联文件的问题的回答,它有一个类似的答案:

Create registry entry to associate file extension with application in C++

【讨论】:

我知道这种将条目添加到上下文菜单的方法。但是,您能否提及如何将任何条目设为默认值?我知道如何使用“文件夹选项”来做到这一点,但命令行或注册表选项会很棒。 (我认为我们需要使用editflags dword 条目来做到这一点,但不确定。) @anishsane 将shell 键的默认值设置为您希望默认的动词键的名称 我发现 regedit 会删除我为命令值输入的文本。这是通过使用双反斜杠而不是单反斜杠来解决的。例如。 "C:\\Program Files (x86)\My Program\\bin\\myprogram.exe" "%1" 无法正确处理 .vcxproj 文件 - 它们在注册表中的显示方式不同。有什么想法吗? 如果要将上下文菜单添加到所有文件类型,请跳过步骤 1,并在步骤 2 到 4 中将 jpegfile 替换为 *【参考方案2】:

将发布源自the previous answer 的我的工作解决方案(以及其作者的其他答案之一)。 它还添加了一个图标。我将它用于所有文件类型并且没有管理员权限。我的注册表中不存在子项*,这是我自己创建的。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\*]

[HKEY_CURRENT_USER\Software\Classes\*\shell]

[HKEY_CURRENT_USER\Software\Classes\*\shell\open_with_notepad_pp]
@="Open with Notepad++"
"icon"="C:\\portable\\npp.7.9\\notepad++.exe"

[HKEY_CURRENT_USER\Software\Classes\*\shell\open_with_notepad_pp\command]
@="\"C:\\portable\\npp.7.9\\notepad++.exe\" \"%1\""

更新

* 替换为.svg 之类的东西,只有在此扩展程序中才会显示菜单项。

【讨论】:

这会为所有文件类型添加一个项目,而不是特定的。【参考方案3】:

注册表中还有一个独立于用户默认程序的键:HKEY_CLASSES_ROOT\SystemFileAssociations。由于没有人在这个问题上提到它......在添加上下文菜单项之前无需检查 ProgID。示例:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.mkv\shell\subtitle]
@="Search subtitles..."

[HKEY_CLASSES_ROOT\SystemFileAssociations\.mkv\shell\subtitle\command]
@="\"D:\\Tools\\subsearch.exe\" \"%1\""

参考:https://docs.microsoft.com/en-us/windows/desktop/shell/app-registration#registering-verbs-and-other-file-association-information

其他注意事项:

HKEY_CLASSES_ROOT 子树可以写入,但一般是合并形成的视图

HKEY_CURRENT_USER\Software\Classes 文件类型注册仅对当前用户可见 HKEY_LOCAL_MACHINE\Software\Classes 在特定计算机上全局注册文件类型

您也可以注册这些课程/也可以

(ProgID) 定义的动词...\SystemFileAssociations\ 中定义的相同优先级,但是依赖于该特定应用程序,当该应用程序卸载时,它通常会删除其注册表项,以及您可能在该键下所做的修改/添加。或者,如果更改默认 (ProgID),您的修改将不再有效。

即使用户更改/卸载默认程序,...\SystemFileAssociations\ 注册也稳定

【讨论】:

Windows 10 - 2019 年 12 月:我对这个答案投了赞成票。我尝试了接受的答案,但它根本不起作用,我不明白为什么。我只能假设它曾经可以工作,但在较新版本的 Windows 中不再有效,或者有一些系统安全警告使其工作/或不工作。我的香草版本的窗户,没有锁定,等等。只是把这个笔记放在任何遇到它并接受答案的人那里是行不通的。 @SteveCarter 通常情况正好相反:写入 HKCR 需要额外的权限,而写入 HKCU 是没有额外权限的用户操作 @FactorMystic 感谢您的反馈。您能否提供有关为什么接受的答案可能不起作用的任何信息?我花了几个小时看这个。我是第一个承认在 Windows 注册表方面我是新手的人,但是我遵循了您写的信,但是我没有右键单击来运行我的程序。还有什么我可能会丢失的吗?感谢您提供的任何反馈。如果需要,很高兴提出另一个问题,但它基本上是相同的问题。 FWIW 我刚刚在 Windows 10 中针对 .SLN 文件进行了此操作 Windows 10 - 1909(2020 年 6 月)注意“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts”中的覆盖(此处描述superuser.com/questions/1424724/…)这将覆盖向上下文菜单添加附加选项的能力,直到您将其删除。

以上是关于仅针对特定文件类型将菜单项添加到 Windows 上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

Joomla 菜单项特定模块不工作

Extjs 网格列标题,将下拉菜单项添加到特定列

将菜单添加到加载项中的 Visual Studio 菜单栏

将新文件类型添加到Windows 7的新上下文菜单中

Windows 资源管理器加载项

仅用于文件夹的 Cocoa finder 菜单项