自定义鼠标右键(层叠式菜单:cascading menu)
Author:KillerLegend
From:http://www.cnblogs.com/killerlegend/p/3575391.html
Date:Tuesday, February 18, 2014
春节期间在家没有网,这篇文章写完后就一直放着,现在终于有网了,发表咯……哈哈
自定义鼠标右键(层叠式菜单:cascading menu)
在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)
今天来实现自定义鼠标右键采用第一种方式,即采用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所示:

说明3:运行修改过的代码将覆盖以前的注册表选项。
另外附上四个实用的鼠标右键管理工具(点击下载),四个软件大约11M,让我吭哧吭哧几k的网速上传了大半个晚上,太不容易了,真心感谢辛老师在学校为我们提供那么给力的网速。春节花200两银子买的3G网卡白瞎了,突然间发现,爱情就像山旮旯里的网速,不是你愿意掏钱,电信商就会给你牛逼的网速。呵呵……
其中仅有一个是安装版,其余三个均是免安装版,解压密码是我的QQ号:1191509410
-----------------------------------------知识共享,为中国的互联网领域加力!------------------------------------------------------------
转载请注明出处:你对别人的劳动成果尊重,别人也会以此对你。所以尊重他人就是尊重自己。
自定义鼠标右键(层叠式菜单:cascading menu)的更多相关文章
- 自定义鼠标右键(层叠式菜单:cascading menu)(文件系统右键、文件夹系统右键和桌面鼠标右键)
转载:http://www.cnblogs.com/killerlegend/p/3575391.html 转载:http://www.cnblogs.com/shouce/p/5101001.htm ...
- js的鼠标右键简单菜单
实现点击鼠标右键时出来菜单代码如下: 主要运用oncontextmenu事件,oncontextmenu 事件在元素中用户右击鼠标时触发并打开上下文菜单. <!DOCTYPE html> ...
- 添加找回鼠标右键新建菜单里的新建office2003/2007/2010文档的简洁方法
鼠标右键新建菜单里的新建office文档丢失了怎么办?我们可以通过一些优化设置软件如优化大师来定制,但更简单的方法是只需要导入相应的注册表设置就行了. 下面即在鼠标右键新建菜单里添加新建office2 ...
- JavaScript自定义鼠标右键菜单
下面为JavaScript代码 window.onload = function () { //好友列表 var f = 0; //判断指定id的元素在页面中是否存在 if (document.get ...
- JQuery模拟网页中自定义鼠标右键菜单
题外话.......最近在开发一个网站项目的时候,需要用到网页自定义右键菜单,在网上看了各路前辈大神的操作,头晕目眩,为了达到目的,突然灵机一动,于是便有了这篇文章. 先放个效果图(沾沾自喜,大神勿喷 ...
- js自定义鼠标右键菜单
document.oncontextmenu = function(e) { return false; } document.onmousedown = function(e) { switch(e ...
- Win10 自定义鼠标右键菜单
1. 点击文件鼠标右键显示软件 1.1 步骤 win+R输入regedit进入注册表 定位到HKEY_CLASSES_ROOT\*\shell下 在shell创建一个你想要的右键文件 例如:Kinok ...
- Win7如何自定义鼠标右键菜单 添加用记事本打开
鼠标右键用记事本打开.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Notepad] @="用记事本 ...
- Win7如何自定义鼠标右键菜单 添加新建WORD文档
鼠标右键添加新建WORD文档.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.doc] @="Word.Docume ...
随机推荐
- Centos6.8 搭建Tomcat服务器
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,是一个可以提供web服务同时也支持Servlet的JSP服务器. ...
- easyui表单校验
痛苦使人清醒,痛苦使人警惕.生于忧患,死于安乐.付出总会有回报. 1.下面跟大家分享使用easyui时表单中的值如何校验. 1.1 首先,在你的jsp/html页面引入JQuery和easyui的js ...
- C++中的类模板
一.学习笔记 1.类模板的格式(1)声明 template<typename T> /* 使用T表示某种类型,比如: */ class AAA { private: T obj; publ ...
- 算法设计与分析基础 (Anany Levitin 著)
第1章 绪论 1.1 什么是算法 1.2 算法问题求解基础 1.2.1 理解问题 1.2.2 了解计算设备的性能 1.2.3 在精确解法和近似解法之间做出选择 1.2.4 算法的设计技术 1.2.5 ...
- 子序列匹配(search,find_end,search_n)
search 版本一返回[first1,last1-(last2-first2)]中的第一个iterator i,使得满足对于[first2,last2)中的每个iterator j,*(i+(j-f ...
- 99乘法表的正反写 (python的写法)
# 正写 j = 0 k = 0 while j < 10: j+=1 while k <10: k+=1 if j>k: k = 0 break else: print('{}*{ ...
- COLUMN_FORMAT 的值:FIXED、DYNAMIC、DEFAULT 的区别(待补充)
参考===MySQL 建表语句 create table 中的列定义: column_definition: data_type [NOT NULL | NULL] [DEFAULT default_ ...
- C166-变量和函数指定物理地址之二
按照<RENAMECLASS Compiler Directive>http://www.keil.com/support/man/docs/c166/c166_renameclass.h ...
- HanLP 关键词提取算法分析详解
HanLP 关键词提取算法分析详解 l 参考论文:<TextRank: Bringing Order into Texts> l TextRank算法提取关键词的Java实现 l Text ...
- Java JDBC基本用法
准备oracle驱动包:maven添加oracle jdbc依赖 pom.xml <!-- oracle jdbc驱动 --> <dependency> <groupId ...