添加右键菜单可以用注册表的shell项或shellex项。
1 shell项
我用过的每台电脑都会被我加上:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Folder\shell\command prompt\command]
@="cmd.exe"
即将注册表“HKEY_CLASSES_ROOT\Folder\shell\command prompt\command”的默认值设为“cmd.exe”。这样我就可以从命令行快速进入指定目录。
HKEY_CLASSES_ROOT有很多表示文件类型的键。Folder表示文件夹,*表示所有文件。在文件类型下增加“shell\提示字符串\command”项,并将该项的值设为对应的命令行。这样在资源管理器对应文件类型上点右键时,菜单中就会有一个菜单项的内容是“提示字符串”,选择这个菜单项就会执行在command项设置的命令。再看一个例子:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\dllfile\shell\Register Component\command]
@="regsvr32 \"%L\""
[HKEY_CLASSES_ROOT\dllfile\shell\Unregister Component\command]
@="regsvr32 /u \"%L\""
[HKEY_CLASSES_ROOT\ocxfile\shell\Register Component\command]
@="regsvr32 \"%L\""
[HKEY_CLASSES_ROOT\ocxfile\shell\Unregister Component\command]
@="regsvr32 /u \"%L\""
[HKEY_CLASSES_ROOT\exefile\shell\Register Component\command]
@="\"%L\" /regserver"
[HKEY_CLASSES_ROOT\exefile\shell\Unregister Component\command]
@="\"%L\" /unregserver"
这个例子给类型dllfile、ocxfile、exefile增加了“Register Component”和“Unregister Component”命令。这样我们可以直接通过右键菜单注册或卸载组件。在HKEY_CLASSES_ROOT下可以看到.dll、.ocx、.exe的默认值指向了dllfile、ocxfile、exefile。
shell项适合比较简单的命令。如果右键菜单要实现比较复杂的功能,我们就要使用Windows的shell扩展编程接口,即使用shellex项。
2 shellex项
2.1 实现shell扩展的COM组件
UltraEdit的右键菜单用起来很方便。那么它是怎么实现的呢?在注册表里可以看到:
[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\UltraEdit-32]
@="{b5eedee0-c06e-11cf-8c56-444553540000}"
“{b5eedee0-c06e-11cf-8c56-444553540000}”是一个COM组件的uuid。在“HKEY_CLASSES_ROOT\CLSID”下可以找到
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}]
@="UltraEdit"
[HKEY_CLASSES_ROOT\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}\InProcServer32]
@="C:\\Program Files\\IDM Computer Solutions\\UltraEdit-32\\ue32ctmn.dll"
"ThreadingModel"="Apartment"
ue32ctmn.dll就是UltraEdit提供的实现了shell扩展功能的COM组件。这个COM组件如果实现了IContextMenu接口,就可以增加右键菜单。菜单项的图标文本是在IContextMenu接口的QueryContextMenu函数中指定的。用户选择菜单项后,Windows会调用IContextMenu接口的InvokeCommand函数,我们在这个函数中实现菜单对应的功能。
我们通常用ATL实现COM组件。因为VC提供了完善的向导,所以用ATL实现一个COM组件其实并不复杂。在网上可以找到一篇叫作《Windows Shell扩展编程完全指南》的chm,包含了实现shell扩展编程的详细指导。这是翻译的文章,chm中也包括了原文(因为转载需要译者同意,我就不提供下载了)。示例代码可以从原文网站下载,我也整理了 一份。使用ALT向导,再仿照示例代码,我们很容易建立自己的工程。然后在QueryContextMenu和InvokeCommand函数中定制自己的菜单项显示和功能。可以把《Windows Shell扩展编程完全指南》当作游戏攻略,找到自己感兴趣的部分,照着做就行了。
2.2 添加和移除菜单
添加菜单除了注册组件外,只要在对应文件类型下增加一项“shellex\ContextMenuHandlers\描述性名称”,并将该项的值设为组件的uuid。uuid是在建立ATL工程时自动生成的。注册组件也是通过在注册表添加一些项目完成的。移除菜单时只要删除注册表的相应项目就可以了。
请注意,“shellex\ContextMenuHandlers”下的“描述性名称”虽然没什么用,但应该能让用户看明白这个扩展是哪个程序加的。例如“Beyond Compare 2”就起了一个奇怪的名字,所以被我删掉了。后来我发现BC2的右键菜单没有了,就在CLSID中找到BC2的dll文件的uuid,然后在“*\shellex\ContextMenuHandlers”加了个 “BC2”项,默认值填上uuid就可以了。
组件相关的注册表项目可以见建立ATL工程时自动生成的rgs文件,以及DllRegisterServer和DllUnregisterServer函数。
以cnbook为例,增加右键菜单需要增加以下注册表项目:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\cnbook]
@="{5BB33E44-519C-42A8-8ABF-81478C57A503}"
[HKEY_CLASSES_ROOT\CLSID\{5BB33E44-519C-42A8-8ABF-81478C57A503}]
@="Shellapi.OpenExt"
[HKEY_CLASSES_ROOT\CLSID\{5BB33E44-519C-42A8-8ABF-81478C57A503}\InProcServer32]
@="D:\\projects\\cnbook\\cnbook\\shellapi.dll"
"ThreadingModel"="Apartment"
[HKEY_CLASSES_ROOT\CLSID\{5BB33E44-519C-42A8-8ABF-81478C57A503}\ProgID]
@="Shellapi.OpenExt"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
"{5BB33E44-519C-42A8-8ABF-81478C57A503}"="Shellapi.OpenExt"
只要删除这些项目就可以移除菜单。 ProgID就是在插入ATL对象时填写的ATL对象名称。组件路径可以在程序中根据应用程序所在目录确定。
分享到:
相关推荐
本示例主要探讨如何在WPF和WinForm应用中调用系统、资源管理器及桌面的右键菜单,以增强用户交互体验。 首先,让我们深入理解一下这两个技术: 1. **WPF**:作为.NET Framework的一部分,WPF引入了基于XAML的声明...
本文将深入探讨这两种策略,并通过分析提供的两个工程——动态添加和静态添加右键菜单的实现方法,来理解其工作原理。 首先,让我们了解静态添加右键菜单。静态添加通常是指在注册表中修改键值来实现的。Windows...
可执行文件`CtxMenu.exe`可以直接运行,无需编译环境,用户可以使用它来快速添加或删除自定义的右键菜单项。 通过这个项目,开发者不仅可以学习到如何利用C++和Windows API进行系统级的编程,还可以了解到注册表...
然后,可以在Component Palette中选择TMenuItem组件,并将其拖到TContextMenuStrip上,为右键菜单添加条目。 4. **关联TContextMenuStrip和控件** 要使右键菜单与特定控件关联,你需要在控件的OnContextMenuStrip...
添加系统右键菜单程序的工作原理通常是通过编写注册表脚本或者使用API接口,将新的菜单项插入到系统注册表中。注册表是Windows系统存储配置信息的地方,包括用户设置、系统参数等。修改注册表需要谨慎,因为错误的...
初次操作可能需要刷新桌面或重启资源管理器才能显示。 3. 选中“Windows PowerShell 脚本”,创建一个新的脚本文件。 4. 双击新创建的脚本文件,系统默认使用记事本打开它。如果你想使用PowerShell ISE编辑脚本,...
综上所述,这个压缩包文件提供了一种快捷方式,通过修改注册表将EmEditor添加到右键菜单,使得用户能更方便地用EmEditor打开文本文件。对于经常使用EmEditor的人来说,这是一个提高效率的好方法。
本资源是一个Qt工程实例,专注于在Windows环境下为文件和目录添加自定义的右键菜单。 首先,我们要理解Qt库中的`QContextMenuEvent`类,这是处理鼠标右键点击事件的关键。当用户在窗口或控件上右击时,这个事件会被...
例如,你可以将常用的文件压缩、解压选项,或者文件夹清理工具添加到右键菜单中,减少打开程序的步骤。 2. **增加背景图**:此功能使得右键菜单在视觉上更具个性化,用户可以选择自己喜欢的图片作为菜单背景,让...
例如,如果你经常需要对图片进行某种操作,如批量重命名或转换格式,你可以将相应的工具添加到右键菜单,这样在文件资源管理器中选中图片后,直接右键点击就能快速执行操作。同样,对于程序员来说,可以将常用的代码...
合理地管理右键菜单,可以使得日常的电脑操作更加得心应手,尤其对于频繁使用电脑的用户来说,这一工具的价值尤为凸显。 在使用过程中,用户应根据自身的实际需求,谨慎添加和删除菜单项,避免过度定制导致的混乱。...
将JD-GUI注册到右键菜单,意味着用户可以直接在Windows操作系统中通过鼠标右键选择目标.class文件,快速启动JD-GUI进行反编译,极大地提升了开发效率。以下是关于这个主题的详细说明: 1. **JD-GUI简介** JD-GUI是...
在C# WinForm应用开发中,常常需要创建用户友好的界面,这可能涉及到将功能按钮固定到菜单栏或实现右键菜单。以下是一些关键知识点,涵盖了如何在C# WinForm环境中实现这样的功能: 1. **菜单栏创建**:在WinForm...
然而,随着各种应用程序的安装,右键菜单可能会变得冗长而混乱,火绒右键菜单管理工具便为此问题提供了解决方案。 此工具的v14.8.8绿色独立版具有以下特点: 1. **易用性**:火绒右键菜单管理工具界面简洁,操作...
右键扩展是指软件通过注册表或自定义DLL文件,将自身的功能选项添加到Windows的文件或文件夹右键菜单中。这些扩展可以是新建文件夹、解压文件、编辑文本等实用功能,但也可能包含不常用或无用的选项,占用系统资源,...
例如,可以添加快速打开命令提示符、资源管理器、文件属性等常用命令,使得日常任务执行更快捷。 5. **批量管理** 使用专门的右键菜单管理工具,如“Context Menu Manager”或“ShellExView”,可以更方便地批量...
shellNew Settings是一款简单实用的右键菜单管理工具,主要作用是清理右键新建菜单,随着电脑程序装的多了,这个新建菜单里的内容也会很多,这时你可以用过shellNewSettings清理掉不常用的程序,等需要的时候,还...
shellNew Settings是一款简单实用的右键菜单管理工具,主要作用是清理右键新建菜单,随着电脑程序装的多了,这个新建菜单里的内容也会很多,这时你可以用过shellNewSettings清理掉不常用的程序,等需要的时候,还...
**MFC对话框右键菜单**是Windows应用程序开发中的一个重要概念,主要涉及到用户界面的交互设计。MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的类库,用于简化在Windows平台上用C++开发应用程序的...
这个资源可能是一个教程或者代码示例,教你如何为自定义应用程序或系统窗口添加自定义的标题栏右键菜单项,以扩展其功能。 要实现这一功能,通常需要了解以下知识点: 1. **WinAPI**:Windows应用程序接口是...