admin 管理员组文章数量: 1184232
右键菜单,指用户在对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才会被调用。
版权声明:本文标题:Customize Your Windows Adventure: Using Win Atl for Enhanced Context Menus 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1772610903a3557313.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论