前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >定制化右键菜单

定制化右键菜单

原创
作者头像
Flyweight
发布2022-06-23 15:48:22
2K0
发布2022-06-23 15:48:22
举报
文章被收录于专栏:通用程序开发通用程序开发

windows系统右键菜单为操作提供了很大的便利。如何把我们常用的程序加入到系统右键菜单?如何定制化菜单行为?本文将对此进行介绍。

本文主要内容:

介绍一种简单的把程序加入右键菜单的方法。

介绍一种定制化菜单的方法。这里的定制化是指:可以定制什么情况下显示你的菜单项以及给你的程序传递启动参数等功能。

一,如何快速把程序加入右键菜单, 以FastMerge(快速合并工具)为例:

1,打开注册表编辑器,打开路径:HKEY_CLASSES_ROOT\*\shell\,新建项,数值填入“FastMerge”(为菜单显示文字)。

2,在FastMerge下新建子项,名称为command(必须是这个名字),数值填入程序全路径:C:\FastMerge\FastMerge.exe

3,完成上面两步,我们可以右键点击任意文件,此时我们就可以看到我们添加的菜单项了:

4,我们发现,菜单项只有文字,如何添加一个图标呢?也很简单,只需要在FastMerge下新建一个字符串值,名称为icon,数值为图片路径即可。

5,最后,如果我们右键点击文件夹,或者硬盘符,我们会发现,没有我们添加的菜单项。

这是因为,在HKEY_CLASSES_ROOT根键之下有以下几个重要的系统关联主键:

*:作用于所有文件。

Directory:作用于一般文件夹。

Folder:作用于所有文件夹,包括特殊文件,如:控制面板,回收站等。

Drive:作用于驱动器,C盘,D盘。

Unknow:作用于系统不能识别的文件类型,即没有注册的文件类型。

我们上面演示的只添加了*主键下的,如果我们希望在点击文件夹或者系统盘时也都能显示我们的菜单项,那么在对应的主键下在做同样的操作就可以了。

二,通过上面的介绍,我们已经能够快速的把程序加入右键菜单了。但是进一步,如果需要给我们的程序传入启动参数(比如传入我们选中的文件)?或者如果我们需要控制菜单显示的条件(比如只有在svn目录下才显示)?那要怎么实现呢?接下来就介绍一种可以实现这些定制化右键菜单的方法。

1,首先新建一个ATL工程(以VS2019为例):

(注意,要勾选Support COM+ 1.0和Support component registrar)

2,工程创建好后,在工程中添加一个ATL Simple Object

添加完ATL对象后,需要在.idl文件中删除原来的默认导出对象,把默认导出改为新建的ATL对象。

3,继承并实现IShellExtInit、IContextMenu的接口方法:

然后实现IContextMenu接口(QueryInterface,GetCommandString、InvokeCommand)以及IShellExtInit接口(Initialize)。系统对这些接口的调用顺序、时刻为:

a:Initialize(用户右键点击某个Shell程序时。)

b:QueryContextMenu(返回S_OK或其他表示初始化成功的HRESULT时,是插入自定义菜单的入口。)

c:GetCommandString(Vista以后的系统不再有作用,不是实现的重点。)

d:InvokeCommand(用户点击新插入的菜单项时,将会调用这个方法。用户点击菜单项回调的入口。)

4,插入自定义菜单:在该函数中可以实现条件判断等操作。比如检测点击的是svn文件夹才添加菜单。

5,实现菜单点击:在该函数中可以实现传入程序的启动参数等操作。

6,修改.rgs:只以添加*主键下的注册表为例,其他主键同样方式。编译后即可写入注册表。

7,注册dll:以管理员权限运行cmd

运行 regsvr32 dll路径 (实现注册)

运行 regsvr32 dll路径 /u (实现反注册)

(右键没有点击svn目录的情况)

(右键点击了svn的情况)

通过上面的方法我们就可以实现一个定制化的右键菜单了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档