为特定的文件类型注册上下文菜单动词
本文关键字:上下文 菜单 注册 类型 文件 | 更新日期: 2023-09-27 18:17:06
我正在为我的系统上的所有视频文件类型注册扩展动词,如下所示:
foreach (var ext in FileTypes.VideoTypes)
{
var progId = Registry.GetValue($@"HKEY_CLASSES_ROOT'.{ext}", null, null);
if (progId == null)
{
continue;
}
Registry.SetValue(
$@"HKEY_CURRENT_USER'SOFTWARE'Classes'{progId}'shell'dlsub",
null,
"Download subtitle");
Registry.SetValue(
$@"HKEY_CURRENT_USER'SOFTWARE'Classes'{progId}'shell'dlsub'command",
null,
@"""D:'myapp.exe"" ""%1""");
}
结果是这样的(mpeg_auto_file
代替mkv
):
[HKEY_CLASSES_ROOT'mpg_auto_file'shell'dlsub]
@="Download subtitle"
[HKEY_CLASSES_ROOT'mpg_auto_file'shell'dlsub'command]
@="'"D:''myapp.exe'" '"%1'""
mp4
和mplayerc.mp4
:
[HKEY_CLASSES_ROOT'mplayerc.mp4'shell'dlsub]
@="Download subtitle"
[HKEY_CLASSES_ROOT'mplayerc.mp4'shell'dlsub'command]
@="'"D:''myapp.exe'" '"%1'""
问题是注册的动词显示在mkv
(和其他几个文件类型)中,但其他文件类型(如mp4
)的上下文菜单不受影响。将谓词添加到HKEY_CLASSES_ROOT'*'shell
中确实适用于这些文件类型,但这显然不是我想要的!
对这些文件类型的区别有什么想法吗?也许它与注册的ProgID有关(所有mplayerc
类型似乎都不起作用…)。
可以为特定文件扩展名找到的默认值(即ProgId
)并不总是指向正确的类(将影响菜单项的类)。在我的测试中,即使在Windows 10的新副本上- WMP11.AssocFile.AVI
是ProgId
的.avi
文件扩展名,但是当在WMP11.AssocFile.AVI'Shell'
(HKEY_LOCAL_MACHINE
或HKEY_CURRENT_USER
)中添加条目时,它根本不影响菜单。我正要放弃,但后来我发现HKEY_CLASSES_ROOT'.avi'OpenWithProgids
存储了更多的值,包括WMP11.AssocFile.AVI
,但也有其他以word App开头的值,即AppX6eg8h5sxqq90pv53845wmnbewywdqq5h
。通过编辑Shell'
,我可以添加菜单项。缺点是-它也影响了其他文件扩展名,以某种方式与AppX6eg8h5sxqq90pv53845wmnbewywdqq5h
链接。我不能接受强迫我迭代OpenWithProgids
中找到的所有类的解决方案,加上我的菜单项必须只显示非常特定的文件扩展名,而不是其他。我决定使用HKEY_CLASSES_ROOT'*'shellex
和动态创建菜单项的dll,基于单击的文件类型(检查扩展名)。