转载: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