在上篇文章c# 添加系统右键菜单(Windows11以前)中我们说了怎么在文件夹上增加一个菜单项,但是我们可能还需要给某个单独的扩展名添加右键菜单。
这里我们不用常见的扩展名来做,我们新做一个.jx
的扩展名,用我们自己的程序打开它。
首先我们要在注册表中注册我们的扩展名,我们可以打开regedit
看一下,在HKEY_CLASSES_ROOT
下面有我们所有已经注册过的扩展名,我们需要在这里面注册我们的.jx
。
直接上代码
RegistryKey jx = Registry.ClassesRoot.OpenSubKey(".jx", true) ?? Registry.ClassesRoot.CreateSubKey(".jx");
这样我们就注册上了我们的扩展名。
然后这个扩展名如何实现打开呢?我们需要把这个项的默认数据指向另一个目录。
例如这里我们的目录就叫jxfile
。
jx.SetValue("", "jxfile");
这样我们就告诉windows,要去HKEY_CLASSES_ROOTjxfile
这里面找处理程序。
然后我们需要的处理就跟文件夹的处理一样了,只不过文件夹我们是操作directory
这个目录,我们自己的文件名是操作jxfile
这个目录。所以代码可以稍微修改就拿过来。
RegistryKey jxfile = Registry.ClassesRoot.OpenSubKey("jxfile", true) ?? Registry.ClassesRoot.CreateSubKey("jxfile"); RegistryKey shell = jxfile.OpenSubKey("shell", true); if (shell == null) shell = Registry.ClassesRoot.OpenSubKey("jxfile", true).CreateSubKey("shell"); RegistryKey custome = shell.CreateSubKey(你的键名称); custome.SetValue("", 你的菜单名称); RegistryKey cmd = custome.CreateSubKey("command"); cmd.SetValue("", Application.ExecutablePath + " %1"); cmd.Close(); custome.Close(); shell.Close(); } MessageBox.Show("注册成功!", "提示");
这里需要注意的是之前我们的diretory
目录是必定存在的,但是jxfile
不一定,所以我们要先判断一下,不存在我们就建立一下。
这里需要注意一个问题,就是我们如果修改了处理程序,就有可能导致原来的默认处理程序不好用,不是单纯的增加我们的处理,而是用我们的处理程序替换了旧的处理程序。
这个问题怎么解决呢,其实我们可以先查一下对应的扩展名是否有处理程序了,如果有,我们就在之前的处理程序里新建我们的条目。
RegistryKey jx = Registry.ClassesRoot.OpenSubKey(".jx", true) ?? Registry.ClassesRoot.CreateSubKey(".jx"); var value = jx.GetValue(""); if (value == null) { value = "jxfile"; jx.SetValue(value); }
这里的value是object,我们可以直接转成string。
然后我们修改一下我们的查找方式
RegistryKey jxfile = Registry.ClassesRoot.OpenSubKey(value.ToString(), true) ?? Registry.ClassesRoot.CreateSubKey(value.ToString());
我们就可以把我们的处理程序附加到原来的处理程序里面了。