# 修改注册表实现添加鼠标右键菜单选项
# 背景
我们安装一些应用程序的时候,经常都会看到程序安装完后,会创建鼠标右键菜单项,方便使用程序。创建系统右键菜单项,通常都会使用扩展Shell接口来实现,会涉及到COM的相关知识,碎语初学者来说比较难理解。
现在,本文介绍一种简单的方法实现相同的功能。就是,修改注册表来实现。现在,把功能实现的原理以及过程,写成文档形式,分享给大家。
# 函数介绍
## RegCreateKeyEx 函数
> 该函数用来创建注册表键,如果该键已经存在,则打开它(注册表键不区分大小写)。
>
> 函数声明
>
> ```c++
> LONG RegCreateKeyEx(
> HKEY hKey,
> LPCTSTR lpSubKey,
> DWORD Reserved,
> LPTSTR lpClass,
> DWORD dwOptions,
> REGSAM samDesired,
> LPSECURITY_ATTRIBUTES lpSecurityAttributes,
> PHKEY phkResult,
> LPDWORD lpdwDisposition
> );
> ```
>
> 参数
>
> - hKey
> [输入] 一个打开键的句柄。调用该函数的进程必须拥有KEY_CREATE_SUB_KEY的权力。该句柄可以是RegCreateKeyEx或者RegOpenKeyEx的返回值,也可以是以下预定义的值:
> HKEY_CLASSES_ROOT
> HKEY_CURRENT_USER
> HKEY_LOCAL_MACHINE
> HKEY_USERS
> HKEY_CURRENT_CONFIG
>
> - lpSubKey
> [输入] 标识子键名称。该参数不能为空。参数中不能存在(\)。
>
> - Reserved
> 保留,必须设置为 0。
>
> - lpClass
> [输入] 指向一个字符串,该字符串定义了该键的类型。可以为NULL。该参数可以在操作本地和远程注册表时使用。
>
> - dwOptions
>
> [输入] 该参数可以是以下值:
> REG_OPTION_BACKUP_RESTORE,0x00000004L
> REG_OPTION_NON_VOLATILE,0x00000000L ,一般用该值
> REG_OPTION_VOLATILE,0x00000001L
>
>samDesired
> [输入] 对指定键希望得到的访问权限的访问标记。 这个参数可以使下列值的联合。
>
> | VALUE | MEANING |
> | ---------------------- | ---------------------------------------- |
> | KEY_CREATE_LINK | 准许生成符号键 |
> | KEY_CREATE_SUB_KEY | 准许生成子键 |
> | KEY_ENUMERATE_SUB_KEYS | 准许生成枚举子键 |
> | KEY_EXECUTE | 准许进行读操作 |
> | KEY_NOTIFY | 准许更换通告 |
> | KEY_QUERY_VALUE | 准许查询子键 |
> | KEY_ALL_ACCESS | 提供完全访问,是上面数值的组合:KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK, KEY_SET_VALUE |
> | KEY_READ | 是KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY的组合 |
> | KEY_SET_VALUE | 准许设置子键的数值 |
> | KEY_WRITE | 是KEY_SET_VALUE、KEY_CREATE_SUB_KEY的组合 |
>
> - lpSecurityAttributes
> [输入]定义返回的句柄是否可以被子进程继承,为NULL时不能继承。
>
> - phkResult
>
> [输出]指向一个变量的指针,该变量用来保存打开注册表键的句柄。如果不再使用返回的句柄,则调用RegCloseKey来关闭它。
>
> - lpdwDisposition
> [输出]可以是以下值。如果为空,则不返回。
> REG_CREATED_NEW_KEY,0x00000001L 该键是新创建的键
> REG_OPENED_EXISTING_KEY,0x00000002L 该键是已经存在的键
>
> 备注
>
> - 不该函数创建的键没有键值。应用程序不能创建HKEY_USERS 或者 HKEY_LOCAL_MACHINE的直接子键。
>
> 返回值
>
> - 返回值 如果函数调用成功,则返回0(ERROR_SUCCESS)。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码。
## RegSetValueEx 函数
> 有名称值的数据和类型时设置指定值的数据和类型。
>
> 函数声明
>
> ```c++
> LONG RegSetValueEx(
> HKEY hKey,
> LPCTSTR lpValueName,
> DWORD Reserved,
> DWORD dwType,
> CONST BYTE *lpData,
> DWORD cbData
> );
> ```
>
> 参数
>
> - hKey
>
> 一个已打开项的句柄,或指定一个标准项名
>
> - lpValueName
>
> 指向一个字符串的指针,该字符串包含了欲设置值的名称。若拥有该值名称的值并不存在于指定的注册表项中,则此函数将其加入到该项。如果此值是NULL,或指向空字符串,则此函数为该项的默认值或未命名值设置类型和数据。
>
> - Reserved
>
> 保留值,必须强制为0。
>
> - dwType
>
> 指定将被存储的数据类型,该参数可以为:
>
> | VALUE | MeANING |
> | ----------------------- | --------------------------------- |
> | REG_BINARY | 任何形式的二进制数据 |
> | REG_DWORD | 一个32位的数字 |
> | REG_DWORD_LITTLE_ENDIAN | 一个“低字节在前”格式的32位数字 |
> | REG_DWORD_BIG_ENDIAN | 一个“高字节在前”格式的32位数字 |
> | REG_EXPAND_SZ | 一个以0结尾的字符串,该字符串包含对环境变量(如“%PAHT”)的 |
> | REG_LINK | 一个Unicode格式的带符号链接 |
> | REG_MULTI_SZ | 一个以0结尾的字符串数组,该数组以连接两个0为终止符 |
> | REG_NONE | 未定义值类型 |
> | REG_RESOURCE_LIST | 一个设备驱动器资源列表 |
> | REG_SZ | 一个以0结尾的字符串 |
>
> - lpData
>
> 指向一个缓冲区,该缓冲区包含了欲为指定值名称存储的数据。
>
> - cbData
>
> 指定由lpData参数所指向的数据的大小,单位是字节。
>
> 返回值
>
> - 返回0(ERROR_SUCCESS)表示成功;返回其他任何值都代表一个错误代码。
## RegCloseKey 函数
> 函数功能是释放指定注册键的句柄。
>
> 函数声明
>
> ```c++
> LONG RegCloseKey(
> HKEY hKey // 释放键的句柄
> );
> ```
>
> 参数
>
> - hKey
>
> [输入] 想要关闭的已经打开的键。
>
> 返回值
>
> - 如果过程执行成功,返回值是 ERROR_SUCCESS。如果功能失败,返回一个非零值,错误码在 Winerror.h 定义。
# 实现原理
Windows提供了一个相关的注册表键,只要添加相应的键值,就可以在鼠标右键菜单中显示。这个注册表键就是:
```
HKEY_CLASSES_ROOT\*\shell
```
那么,右键菜单创建的流程就是:
- 首先,我们可以在这个注册表键中,创建一个任意名称的子键,这个子键就对应右键菜单项的名称
- 然后,设置子键的键值“Icon”的数据,把右键菜单项对应的图标文件写入到键值“Icon”中
- 最后,在子键下面继续新建一个子键“command”,而且将右键菜单项关联的程序路径写入到“command”子键默认值中去
这样,便实现了创建鼠标右键菜单项。要想获取鼠标右键选中的文件路径,只需将关联程序路径默认添加 “%1” ,然后写入在上述“command”子键的键值中去即可。其中%1代表右键选中的文件,这样当点击菜单后就可以执行你指定的程序("520.exe")并传入选中的文件名作为命令参数,这样就可以处理这个文件了。
# 编码实现
## 创建注册表键并设置键值
```c++
BOOL SetRegValue(HKEY hMainKey, char *lpszSubKey, char *lpszKeyValueName, char *lpszKeyValue)
{
HKEY hKey;
// 打开或创建注册表键
if (ERROR_SUCCE
精选_修改注册表实现添加鼠标右键菜单选项_源码打包
版权申诉
102 浏览量
2022-03-07
19:21:42
上传
评论
收藏 191KB ZIP 举报
工具盒子
- 粉丝: 58
- 资源: 1313
最新资源
- QuestionTwo.java
- QuestionOne.java
- OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 南京邮电大学数学实验:熟练掌握 Matlab 软件的基本命令和操作
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 2017校招真题校园招聘真题算法题(37道)Python源码.zip
- 基于单片机protues仿真的多功能自动饮水机系统设计(仿真图、源代码、演示视频)
- 论文《一种修复流程挖掘事件日志中缺失活动标签的深度学习方法》翻译
- 智慧电厂相关资料发电控制的方式
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈