为特定的文件类型注册上下文菜单动词

本文关键字:上下文 菜单 注册 类型 文件 | 更新日期: 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.AVIProgId.avi文件扩展名,但是当在WMP11.AssocFile.AVI'Shell' (HKEY_LOCAL_MACHINEHKEY_CURRENT_USER)中添加条目时,它根本不影响菜单。我正要放弃,但后来我发现HKEY_CLASSES_ROOT'.avi'OpenWithProgids存储了更多的值,包括WMP11.AssocFile.AVI,但也有其他以word App开头的值,即AppX6eg8h5sxqq90pv53845wmnbewywdqq5h。通过编辑Shell',我可以添加菜单项。缺点是-它也影响了其他文件扩展名,以某种方式与AppX6eg8h5sxqq90pv53845wmnbewywdqq5h链接。我不能接受强迫我迭代OpenWithProgids中找到的所有类的解决方案,加上我的菜单项必须只显示非常特定的文件扩展名,而不是其他。我决定使用HKEY_CLASSES_ROOT'*'shellex和动态创建菜单项的dll,基于单击的文件类型(检查扩展名)。