仅针对特定文件类型在Windows右键菜单中添加菜单项

58

我已经开发了一个应用程序,可以使用窗口上下文菜单(右键单击文件)加载图像,目前它正在工作,但reg key打开着。

HKEY_CLASSES_ROOT\*

它可以与所有文件一起使用。

我希望上下文菜单中的菜单项仅在 .jpg 文件中显示。

我该如何做?我应该使用哪些注册表键?

4个回答

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

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

  2. 设置该文件类型的上下文菜单项(verb)属性

    你可以在HKEY_CURRENT_USER\Software\Classes\jpegfile\shell里设置每个用户上下文菜单项。该键具有文件类型的一系列动作。在HKEY_LOCAL_MACHINE\Software\Classes\jpegfile\shell中也有类似的键,这是该文件类型的系统默认值。你也可以在那里放置一个verb键,但如果同样的键存在于HKCU中,则会被覆盖,请注意。

  3. 设置命令值

    最少需要设置的键值是command子键的默认值才能使它起作用。你需要使用你的应用程序的路径来设置它,例如: HKEY_CURRENT_USER\Software\Classes\jpegfile\shell\open_with_myapp\command将设置为"c:\path\to\myapp.exe" "%1"。现在,.jpg文件的上下文菜单将具有“open_with_myapp”项目,当点击时将启动你的应用程序,并将所选文件的文件名作为参数传递。当然,你的应用程序如何处理参数取决于你,因此,你需要将参数字符串设置为你的应用程序可以处理的内容。

  4. 设置其他动作属性

    我想你可能希望上下文菜单项读起来更加友好。你可以通过设置该键的默认值(open_with_myapp)使上下文菜单显示任何你想要的标签来为你的项目命名。

这就是基本概述。一定要查看我在有一个类似答案的关于文件关联的问题上的回答:


2
我知道如何将条目添加到上下文菜单。但是,你能否提及如何将任何条目设置为默认值?我知道如何使用“文件夹选项”来完成此操作,但使用命令行或注册表选项会更好。 (我认为我们需要使用“editflags” dword 条目来完成,但不确定。) - anishsane
1
@anishsane 将 shell 键的默认值设置为您希望成为默认值的动词键的名称。 - Factor Mystic
1
我发现了一个情况,即regedit会删除我输入的命令值文本。这可以通过使用双反斜杠而不是单个反斜杠来解决。例如:"C:\Program Files (x86)\My Program\bin\myprogram.exe" "%1" - André van Schoubroeck
无法正确处理 .vcxproj 文件 - 它们在注册表中显示的方式不同。有什么想法吗? - gil_mo
2
我认为这在Windows 10上不起作用;至少我无法让它工作。我不得不将它放在SystemFileAssociations中。*\Classes中的所有内容(即使在HKCR.whatever视图中出现)似乎都会被完全忽略,如果它在SystemFileAssociations中。 (我在这里找到了另一个发现相同问题的人https://dev59.com/a5rga4cB1Zd3GeqPs9mr) - Jason C
显示剩余5条评论

51

还有一个与用户默认程序独立运作的注册表关键字: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://learn.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版本中不再有效,或者存在一些系统安全注意事项使其工作/不工作。我的Windows版本是原始的,没有锁定等。只是为了提醒任何遇到采纳答案无法解决问题的人。 - IamSierraCharlie
@SteveCarter 通常情况下是相反的:写入 HKCR 需要额外的权限,而写入 HKCU 则是用户操作,无需额外的权限。 - Factor Mystic
1
@FactorMystic 感谢您的反馈。您能否提供任何信息,说明为什么被接受的答案可能不起作用?我花了几个小时来研究这个问题。我首先承认,在处理Windows注册表方面,我是一个新手,但我完全按照您所写的步骤进行操作,但我无法通过右键单击运行我的程序。我是否还遗漏了其他内容?感激您能提供的任何反馈。如果需要,我很乐意提出另一个问题,但本质上是相同的问题。 - IamSierraCharlie
4
对于 .SLN 文件在 Windows 10 - 1909 (2020 年 6 月) 的问题,FWIW 我刚刚进行了解决。请注意 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\ 路径下的覆盖设置(参见 https://superuser.com/questions/1424724/file-extension-shell-verbs-dont-show-up-in-windows-10-context-menus),这会覆盖添加其他选项至右键菜单的能力,直到你将其删除为止。 - aolszowka
这是对我有效的方法。谢谢! - Seth

1
在注册表中(通过regedit.exe),导航到:

HKEY_CLASSES_ROOT\SystemFileAssociations\.jpg\Shell

创建一个名为"MyApp"的新键。
在"MyApp"中创建另一个键,并将其命名为"command"。
在"command"中,将"(Default)"的值更改为您的应用程序路径,如下所示:
"D:\Python_Programlar\pdftopng\app.exe" "%1"
在"MyApp"中,输入一个文本作为"(Default)"的值,以便在上下文菜单中看到您想要的内容。
可选:在"MyApp"中,添加一个新的"String Value"或"Expandable String Value",并将其设置为应用程序图标(.ico)文件的路径(例如"D:\Python_Programlar\pdftopng\app.ico"),以在Windows资源管理器上下文菜单中的新条目旁边显示一个图标。

screen snippet of Windows Explorer context menu


0

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

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的内容,仅对此扩展名显示菜单项。


这将为所有文件类型添加一个项目,而不是特定类型的文件。 - d-k-bo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接