
右键菜单,指用户在对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)
系统对这些接口的调用顺序、时刻为:
- Initialize(用户右键点击某个Shell程序时)
- QueryContextMenu(1.返回S_OK或其他表示初始化成功的HRESULT时。插入自定义菜单的入口。)
- GetCommandString(用户光标盘旋(hover)在插入的菜单项时,系统status bar将显示的信息。Vista以后的系统不再有作用,不是实现的重点。)
- InvokeCommand(用户点击新插入的菜单项时,将会调用这个方法。用户点击菜单项回调的入口。)
下面笔者来解析一下这些接口的作用,所有对本文较为有用的地方都以红色标注。
HRESULT Initialize(
PCIDLIST_ABSOLUTE pidlFolder,
IDataObject *pdtobj,
HKEY hkeyProgID
);
参数pdtobj,表示指向某个Shell Object的指针。可以通过这个指针获取用户右键单击的Shell Object信息。比如,可以获取该Shell Object的名称,并且判断其是不是我们需要处理的类型。特别地,对于右键单击桌面空白处或者是文件夹空白处,pdtobj为NULL。
注:只有当这个函数返回S_OK的时候,QueryContextMenu才会被调用。

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





