Windows 右键菜单扩展

本文介绍了如何使用COM接口扩展Windows右键菜单,包括新建ATL项目、实现IContextMenu和IShellExtInit接口、修改注册表脚本和注册COM DLL。详细阐述了右键菜单扩展的调用流程,提供项目代码链接。

 

右键菜单,指用户在对Windows Shell Object右键单击时,弹出的上下文菜单(Context Menu)。

如上图所示的对右键菜单进行扩展,属于Windows Shell Extension编程的一部分。

注:一般扩展程序的信息会注册到注册表某个路径的ShellExt下。

本文将介绍利用COM接口对Windows右键菜单进行扩展,笔者将分四个步骤对整个项目建立过程进行引导和解释,并会在文章末尾将给出项目代码(C++)链接。

声明:本文在某些API的解释中,加入了笔者的个人理解,可能并不完全或存在理解错误,故在重要WinAPI的解释后面会加入MSDN的连接,方便读者直接查阅官方文档。一切解释请以官方文档为准!

可能需要用到但并不是阅读本文必须的前置知识:COM、ATL、注册表。

 

一. 新建一个ATL项目

Visual Studio——新建项目——ATL——使用默认配置(一直按下一步即可)。

注:默认配置中程序类型为动态链接库dll。

注:如果生成的项目中多了一个以PS为后缀的子项目,可以选择将之移除。

 

二. 为项目添加一个简单的ATL对象,继承并实现相应的IContextMenu、IShellExtInit的接口方法。

右键项目——添加(Add)——类(Class)——弹出添加引导

引导中双击选择ATL简单对象(ATL Simple Object),并根据需要填写类名字以及对应的信息,(某些信息VS将自动帮填写,但ProgID建议手动填写一下),点击完成生成一个ATL 简单对象,会发现项目中生成了刚才填写类名字的.h、.cpp、.rgs文件。

打开.h文件,会发现刚才填写的C++类型的声明,请在继承语法的最后添加上

public IContextMenu,public IShellExtInit

添加COM类型映射:在宏BEGIN_COM_MAP与宏BEGIN_COM_END之间的列表下手动加上

COM_INTERFACE_ENTRY(IContextMenu)

COM_INTERFACE_ENTER(IShellExtInit)

然后覆盖并实现IContextMenu接口(QueryInterface,GetCommandString、InvokeCommand)以及IShellExtInit接口(Initialize)

系统对这些接口的调用顺序、时刻为:

  1. Initialize(用户右键点击某个Shell程序时)
  2. QueryContextMenu(1.返回S_OK或其他表示初始化成功的HRESULT时。插入自定义菜单的入口。)
  3. GetCommandString(用户光标盘旋(hover)在插入的菜单项时,系统status bar将显示的信息。Vista以后的系统不再有作用,不是实现的重点。)
  4. InvokeCommand(用户点击新插入的菜单项时,将会调用这个方法。用户点击菜单项回调的入口。)

下面笔者来解析一下这些接口的作用,所有对本文较为有用的地方都以红色标注。

​HRESULT Initialize(
  PCIDLIST_ABSOLUTE pidlFolder,
  IDataObject       *pdtobj,
  HKEY              hkeyProgID
);

参数pdtobj,表示指向某个Shell Object的指针。可以通过这个指针获取用户右键单击的Shell Object信息。比如,可以获取该Shell Object的名称,并且判断其是不是我们需要处理的类型。特别地,对于右键单击桌面空白处或者是文件夹空白处,pdtobj为NULL

注:只有当这个函数返回S_OK的时候,QueryContextMenu才会被调用。

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值