自定义鼠标右键(层叠式菜单: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的菜单项了. 在网上查找了一下, 结合自己系统的情况发现了解决办法. 由于我 ...
随机推荐
- Python面向对象:获取对象信息
学习笔记内容简介: 获取对象属性和方法的函数: type(): 判断对象类型 isinstance() : 判断class的类型 dir() : 获得一个对象的所有属性和方法 把属性和方法列出来是不够 ...
- Copying and Cloning Objects
PHP Advanced and Object-OrientedProgrammingVisual Quickpro GuideLarry Ullman class someClass { publi ...
- idea启动tomcat后访问项目报java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
一.报错“java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet” 1.File --- ...
- Nginx日志切割之Logrotate篇
不管是什么日志文件,都是会越来越大的,大到一定程度就是个可怕的事情了,所以要及早的做处理,方法之一就是按时间段来存储,不过linux系统提供了Logrotate的日志管理工具,很好用,不用写计划任务脚 ...
- BZOJ5056 OI游戏 最短路+组合数学
链接接接接接! 正解:最短路+小学奥数 乘法原理 解题报告: 首先读懂题意(,,,我觉得我吃枣死于语文太差读不懂题目QAQ 大意就是港,要求从第一个点到其他各点的长度都是最短的方案有多少个(ummm, ...
- mysql 使用存储引擎
三 使用存储引擎 方法1:建表时指定引擎 指定innodb,不写默认也是innodb use 数据库先 create table innodb_t1(id int,name char)engine=i ...
- 帝国cms调用最新文章 利用文字调用标签phomenews
最近建站时,朋友要求在头部用帝国cms调用最新文章,当时想了用灵动标签调用,但需要设置一个具体的栏目id,这样就不是调用全站的最新文章了,后面查看了一下标签说明,想到了文字调用标签phomenews. ...
- Andrew Ng-ML-第十四章-无监督学习
1.无监督学习概述 图1.无监督学习 有监督学习中,数据是有标签的,而无监督学习中的训练集是没有标签的,比如聚类算法. 2.k-means算法 k-means算法应用是十分广泛的聚类方法,它包括两个 ...
- 怎么把<li>标签里的内容付给文本框
如果你不想使用jq,那就可以这样先写一个js函数,function val(a){alert(a);} 然后在li标签上添加点击事件,调用这个函数并将当前li里的文本当做参数一起发送给js函数< ...
- #C语言初学记录(位运算)
位运算 Problem Description7-1 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由 ...