自定义鼠标右键(层叠式菜单:cascading menu)(文件系统右键、文件夹系统右键和桌面鼠标右键)
转载:http://www.cnblogs.com/killerlegend/p/3575391.html
转载:http://www.cnblogs.com/shouce/p/5101001.html
在MSDN上提到了三种方式来创建,如下:
- Creating Cascading Menus with the SubCommands Registry Entry
- Creating Cascading Menus with the ExtendedSubCommandsKey Registry Entry
- Creating Cascading Menus with the IExplorerCommand Interface
官网资料在这里:http://msdn.microsoft.com/zh-cn/library/cc144171(v=vs.85)
官网资料:https://msdn.microsoft.com/en-us/library/windows/desktop/cc144171(v=vs.85).aspx
今天来实现自定义鼠标右键采用第一种方式,即采用SubCommands来实现层叠式菜单,可以实现的效果如下图中红色框所示:

其中的所有内容比如应用程序,以及左边显示的图标完全可以自定义,按照自己的爱好来实现。
我们先手动一步步注册表中的选项,来了解一下实现的原理,最后使用注册表的代码来一步实现:
我们为鼠标右键添加一个ContextMenu选项,然后在里面加入各种我们想要打开的应用程序:
步骤1:转到
HKEY_CLASSES_ROOT\*\shell
按照图示1.1新建键, 在这里命名为ContextMenu.

然后在左侧空白处鼠标右键,选择新建一个字符串值,如图1.2所示,

名字设置为MUIVerb,名字必须为MUIVerb,这就是所谓的标准名字(Canonical Verbs).然后双击它,打开后将其值设置为ContextMenu这个字符串就是在鼠标右键中显示的名称(你当然可以设置为其他的值),如图1.3所示:

经过这一步,我们可以在一个具体的文件上鼠标右键了,就会出现一个名字为ContextMenu的鼠标右键选项,注意是一个文件,而不是一个目录.也就是说,这个时候我在一个应用程序,doc文档,txt文本或者图片上鼠标右键会出现而在一个包含有子文件的文件夹上或者桌面上鼠标右键是不会出现的.如图1.4和图1.5对比所示.


然后我们需要为我们添加的选项添加命令,和建立MUIVerb同样的步骤建立一个SubCommands,
其值设置为ContextMenu.1;ContextMenu.2;ContextMenu.3;ContextMenu.4;ContextMenu.5好的我们暂且先添加这5个选项吧,每一个选项对应于一个命令(应用程序),稍后我将说在那里设置每一个命令的具体执行路径。如图1.6所示。

这时候。在一个应用程序图标上鼠标右键可以看到ContextMenu选项右边出现了一个小小的黑色箭头,不过现在还不能展开,因为我们还没有为其添加具体的应用程序,如图1.7所示。

步骤2:
现在我们来添加具体的命令选项,以使那个黑色的小箭头能够展开。在注册表中展开到下面这个位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\
然后在shell上新建一个键(key),如图2.1所示,名字为ContextMenu.1

然后转到ContextMenu.1中,将默认的值设置为应用程序的名字(总之是你想要其显示的字符),如图2.2所示。

然后再在ContextMenu.1上新建一个键,名字为command,然后转到新建的command键,在command键中默认的值设置为应用程序路径,如图2.3所示。

然后同样的方式建立ContextMenu.2;ContextMenu.3;ContextMenu.4;ContextMenu.5。如图2.4所示。

为了方便,我将它们均设置为了notepad。初步效果如2.5所示。

显然,这个选项里面没有图标,很是不爽,那么我们只需要很简单的操作就可以为各个选项加入图标。
步骤3:
以选项之一为例加入图标,转到ContextMenu.1,然后为其添加一个icon项目,值设置为应用程序路径或者是你自己定义的图片路径即可。如图3.1所示。

现在,再在一个文件上鼠标右键这个选项就会出现图标了,如图3.2所示,但是其父级还没有图标,也是同样的方式添加。

步骤4:
上面的只是在文件上鼠标右键才会出现,如果再在注册表下面的这些位置按照步骤1添加就可以在文件夹或者桌面上鼠标右键出现了。
[HKEY_CLASSES_ROOT\Directory\Background\shell\]
[HKEY_CLASSES_ROOT\Directory\shell\]
[HKEY_CLASSES_ROOT\LibraryFolder\background\shell\]
步骤5:
可是如果按照上面的步骤却是很累人啊,如果我要是添加7-8个选项,那可真有得受了,不过不用担心,现在我们用代码来实现,很简单的:在Windows7的注册表代码中,开头必须以Windows Registry Editor Version 5.00开始(也就是说,reg文件的开始不准有空行),然后空一行,用中括号括起路径,在在下面书写要添加的东西。总之对于我们要实现的功能涉及不到多复杂的,再复杂的我目前也不懂。用代码来加入一个新的鼠标右键菜单,我们将其命名为TestMenu吧,OK,代码如下:
添加一个鼠标右键选项(下载代码):

为添加的鼠标右键选项添加功能(下载代码):

分别保存为first.reg,second.reg,依次运行即可.
上面的代码运行后效果如图final所示。

一些说明:
说明1:代码"SubCommands"="TestMenu.0;TestMenu.1;TestMenu.2;TestMenu.3;|;TestMenu.4"中,里面的|线是分割线,如果你不喜欢,你去掉它就是了。还有就是用双引号括起来的路径分隔符必须得是两条,需要转义。@表示默认值的设置。
说明2:如果你想要修改其中的一项功能,比如说修改Notepad4为win7自带的截图软件,你可以将最后一项代码修改为下面的(下载代码):

那么结果就会如图addition所示:

关于RegDeleteKey无法删除注册表项
转载:http://blog.csdn.net/yiyefangzhou24/article/details/6134536
BOOL NosafeModle(void)
{
HKEY hKey;
DWORD count;
LPTSTR data1=_T("SYSTEM//CurrentControlSet//Control//SafeBoot//Minimal");
LPTSTR data2=_T("SYSTEM//CurrentControlSet//Control//SafeBoot//Network");
/*if (RegCreateKey(HKEY_CURRENT_USER,data,&hKey)==ERROR_SUCCESS)
{
RegDeleteKey(hKey,_T("Minimal"));
RegDeleteKey(hKey,_T("Network"));
}*/
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,data1,,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
{
if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&count,NULL,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
{
DWORD dwIndex=;
char szName[]={};
for(;dwIndex<count;dwIndex++)
{
if(RegEnumKey(hKey,dwIndex,szName,)==ERROR_SUCCESS)
{
RegDeleteKey(hKey,(const char *)szName);
}
}
}
}
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,data2,,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
问题: RegCreateKeyEx 返回 0 但注册表没写入成功
查看下 RegCreateKeyEx 以及 RegSetValueEx 的返回值,如果不是ERROR_SUCCESS的话,到https://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx 查看下错误代码的意义。另外,如果是x64系统,RegCreateKeyEx的第六个参数要写 KEY_WOW64_64KEY | KEY_ALL_ACCESS,否则
HKEY_LOCAL_MACHINE\SOFTWARE
会被重定向到
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node,
最后一点,如果提示权限不足,要以管理员权限启动编程环境。例如用管理员权限打开visual studio,然后再打开你的工程,否则RegCreateKeyEx 以及 RegSetValueEx的返回值总是5(Access is denied.)
#include<windows.h>
#include<stdio.h>
int main() {
HKEY hroot; //子键句柄
DWORD dwDisposition;
LONG WINAPI r;
if ((r = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", , NULL, , KEY_WOW64_64KEY | KEY_ALL_ACCESS, NULL, &hroot, &dwDisposition)) == ERROR_SUCCESS)
if ((r = RegSetValueEx(hroot, "Hangagi", , REG_SZ, (BYTE *)"E:\\Program Files", sizeof("E:\\Program Files"))) == ERROR_SUCCESS)
printf("OK");
return ;
注意:删除子键 用 RegDeleteKeyEx() 或RegDeleteKey(),必须先删除 其下的 所有键值 , 然后才能删除 子键。
出处:http://bbs.csdn.net/topics/320073562
在文件夹上添加右键
HKEY_CLASSES_ROOT\Folder\\shell (多级菜单的话同在文件上添加右键) 桌面鼠标右键
HKEY_CLASSES_ROOT\Directory\\Background\\shell
command中的值 不用添加 %1
转载:http://www.350351.com/plus/view.php?aid=97407
自定义鼠标右键(层叠式菜单:cascading menu)(文件系统右键、文件夹系统右键和桌面鼠标右键)的更多相关文章
- 重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件
原文:重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件 [源码下载] 重新想象 Windows 8 Store Apps ( ...
- 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件
[源码下载] 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 创建文件夹,重命名文件夹,删除文件夹, ...
- 背水一战 Windows 10 (86) - 文件系统: 获取文件夹的属性, 获取文件夹的缩略图
[源码下载] 背水一战 Windows 10 (86) - 文件系统: 获取文件夹的属性, 获取文件夹的缩略图 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 获取文件夹的属性 ...
- 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件
[源码下载] 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件 作者:webabcd 介绍背水一战 Windows 10 之 ...
- Orchard扩展 自定义后台管理导航菜单 Admin Menu
金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉. 金天:看源码永远是Coder学习的最快捷路径. 看本文需要对Orchard大致体系, 特别是Mo ...
- Android Studio的使用(十)--读取assets、Raw文件夹下文件,以及menu、drawable文件夹
1.直接在/src/main目录下面新建assets目录 2.接下来即可读取文件 3.读取Raw文件夹下文件也类似.首先在res文件夹下新建raw目录,然后放入需要的文件即可读取. 4.menu和dr ...
- Spark修炼之道(基础篇)——Linux大数据开发基础:第二节:Linux文件系统、文件夹(一)
本节主要内容 怎样获取帮助文档 Linux文件系统简单介绍 文件夹操作 訪问权限 1. 怎样获取帮助文档 在实际工作过程其中,常常会忘记命令的使用方式.比如ls命令后面能够跟哪些參数,此时能够使用ma ...
- ios中Raw文件系统常用文件夹
1.[/Applications] 常用软件的安装目录 2.[/Applications/Preferences.app/zh_CN.lproj] 软件Preferences.app的中文汉化文件存放 ...
- Linux下nautilus的右键快捷菜单项设置
某一天我的Linux更新完后, 我照常在文件夹下点击右键想打开终端, 却发现右键快捷菜单没有Open in terminal的菜单项了. 在网上查找了一下, 结合自己系统的情况发现了解决办法. 由于我 ...
随机推荐
- ionic 相关问题解决办法记录
1.npm无法安装模块 报code E400错误 解决办法: 删除npmrc文件. 注意:不是nodejs安装目录npm模块下的那个npmrc文件,而是在C:\Users\{账户}\下的.npmrc文 ...
- wampserver 权限配置
当你按照网上以前介绍的wamp配制方法,安装好wamp后.本地的locallhost和127.0.0.1一切都正常,他们都能对你本地的网页文件进行访问.这里说一说,手机借助wamp访问本地文件的方法. ...
- 关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
关于call与apply的理解容易让人凌乱,这里有个方法可供参考 tiger.call(fox,arg1,arg2...) tiger.apply(fox,[arg1,arg2...]) 理解为 fo ...
- oracle查询表结构语句
select o.table_name, tmp.comments, o.COLUMN_NAME, t.comments, o.DATA_TYPE || CASE TRIM(o.DATA_TYPE) ...
- [.NET]解决EMF图像自动放大空白
在.NET中产生emf主要使用Metafile对象,但在使用过程中会发生图像自动放大,多余空白的问题. 模拟:声明Size(100,100)的区域,并绘制p1(-50,-50)->p2(50,5 ...
- ul li剧中对齐
html: <div class="footernav"> <ul> <li>首页</li> <li>文章</li ...
- hdu1181 (变形课)简单地dfs
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=259#problem/F Description 呃......变形课上Harr ...
- 如何给Pycharm加上头行 # *_*coding:utf-8 *_*?
File>Setting>Editor>Code Style>File and Code Templates>Python Script 后面加上 # *_*codin ...
- 机器学习理论基础学习14.2---线性动态系统-粒子滤波 particle filter
一.背景 与卡曼滤波不同的是,粒子滤波假设隐变量之间(隐变量与观测变量之间)是非线性的,并且不满足高斯分布,可以是任意的关系. 求解的还是和卡曼滤波一样,但由于分布不明确,所以需要用采样的方法求解. ...
- Python常用函数及说明
原文地址:博客园 CSDN 基本定制型C.__init__(self[, arg1, ...]) 构造器(带一些可选的参数)C.__new__(self[, arg1, ...]) 构造器(带一些可 ...