引言
在windows系统下,使用注册表实现右键菜单功能。原本在微软官方文档中按照步骤操作,没办法实现我想要的效果,找了好久才找到正确的解决方法(可能是系统或版本问题),故在此做个笔记,以便于查阅。
注册表
打开方式
按下 win+R 组合键,输入 regedit ,再回车,即可打开。
路径
右键菜单
HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell
在这个路径下,添加或删除自己定义的右键菜单即可,无需在其他位置操作。
网上有说在 HKEY_CLASSES_ROOT*\shell 这个路径下编辑,也可以,不过在 HKEY_CURRENT_USER\SOFTWARE\Classes*\shell 下编辑就会自动在前者路径下创建或删除。
菜单
菜单名
右键 shell ,新建项,就创建好菜单了。默认项名为菜单名,如果要修改右键菜单名称,可以如下两种方式
//1.直接修改默认项的参数即可,级联菜单不能这样做
//名称 类型 数据
(默认) REG_SZ 菜单名
//2.新增一个字符串值,命名为 MUIVerb ,可用于级联菜单
//名称 类型 数据
MUIVerb REG_SZ 菜单名
菜单图标
//名称 类型 数据
icon REG_SZ ico图片绝对路径
过滤文件
可以指定该菜单只在哪些文件下右键才会出现
//名称 类型 数据
AppliesTo REG_SZ System.ItemType:png //指定只在png图片上右键才会出现
数据过滤类型
System.ItemType //指定文件类型
System.ItemName //文件名包含指定内容
条件,可实现多种文件都可以打开,或者为该文件符合多种条件才能打开
AND / OR
示例
(System.ItemType:png) OR (System.ItemType:jpg) //png或jpg文件右键菜单都可以出现
执行指令
右键你的菜单项,新建项 取名 command ,修改默认的数据值
//名称 类型 数据
(默认) REG_SZ exe文件绝对路径+参数
数据格式如下
exe文件绝对路径 参数1 参数2 参数...
若需要传递文件的路径->参数(建议实际使用时都加上引号)
%1 //选中的单个文件的路径
%2 //选中的单个文件的所在文件夹路径
%* //选中的所有文件的所有文件路径,空格分隔
%V //选中的若为快捷方式,则为目标路径,否则同%1
%n //选中的文件名(无扩展名)
%x //选中的文件扩展名
示例
//名称 类型 数据
(默认) REG_SZ E:/tool.exe open %1
效果图
//结构
shell
| test
| (默认) REG_SZ (数值未设置)
| MUIVerb REG_SZ 就是一个测试
| command
| (默认) REG_SZ E:/tool.exe open %1
级联菜单
一级菜单
请看上面内容
不同之处,在于若有子菜单的情况下,不设置 command 项,另外增加 SubCommands 字符串值,如下(注意,数据不用设置)
//名称 类型 数据
SubCommands REG_SZ
二级菜单
在一级菜单下新建项 shell ,然后在这个一级菜单下的shell设置菜单就可以了。
两层菜单示例
//结构
shell
| top
| (默认) REG_SZ (数值未设置)
| MUIVerb REG_SZ 就是一个测试
| SubCommands REG_SZ
| shell
| one
| (默认) REG_SZ (数值未设置)
| MUIVerb REG_SZ 打开
| command
| (默认) REG_SZ E:/tool.exe open %1
| two
| (默认) REG_SZ (数值未设置)
| MUIVerb REG_SZ 删除
| command
| (默认) REG_SZ E:/tool.exe delete %1
效果图
多级菜单
如上 一级和二级 菜单的设置方式,将二级如一级那般设置,类似俄罗斯套娃式,就可以实现多级菜单了。
效果图
开机自启
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
在该路径下,新建字符串值即可,如下
//名称 类型 数据
youer_name REG_SZ exe绝对路径
数据填写格式
exe绝对路径 参数1 参数2 参数...
cmd操作指令
查询
reg query 注册表路径
新建
reg add 注册表路径 /v 值名称 /t 类型 /d 数据 /f
不存在该路径,则自动创建;仅创建项,则不需要 /v 和 /t 。
/f 为若已存在,则覆盖,可以不写
删除
reg delete 注册表路径 /v 值名称 /f
/f 为强制删除,可以不写