关键字:Shell, Namespace, IContextMenu, 外壳, 名字空间, 上下文菜单 |
文章难度:初级 |
介绍(What is the shell contextmenu)
随着越来越多的软件对外壳的扩展,资源管理器变得是越来越强大和易用,以前要压缩一个或多个文件,你得老老实实找到压缩软件的快捷方式并打开他,接着进行一系列的选择操作,这对我这种懒人来说绝对是很烦的一件事,而有了外壳的菜单扩展机制,你只需在资源管理器中选好你要操作的文件然后弹出右键菜单选择相应的项就搞定了,多方便啊。
呃,打住,本文并不是要介绍怎么给资源管理器加入一个菜单扩展项(注1),而是介绍怎么在自己的程序中调用那个有着丰富功能的上下文菜单。例如FlashFXP中左边的本地文件窗口(图1):
(图1:假设你在打开FTP软件想把一些文件上传时才发现这些文件尚未打包,怎么办?切换到资源管理器把他们打包再回到FlashFXP吗?No no no,别做这么没效率的事,在FlashFXP左窗口中把相应文件选中后按住shift键后弹出右键菜单看看,简直太美妙了,以后在FTP上down到什么好音乐我直接就可以用喜欢的播放器来欣赏了。)
(注1:基本上认为写一个上下文菜单扩展项是比较容易实现的,有大量的文章和示例代码可从http://www.codeproject.com/shell得到)
原理(How to implement)
我们知道,在win32中是以外壳名字空间(注2)的形式来组织文件系统的,在外壳名字空间里的每一个文件夹都实现了一个IShellFolder的接口,通过这个接口我们可以直接查询或间接得到其他相关的接口。
跟对象(注3)的上下文菜单相关的接口是IContextMenu,通过对象的父文件夹的IShellFolder::GetUIObjectOf方法可得到该接口。得到该接口后,可以用IContextMenu::QueryContextMenu方法来生成上下文菜单的菜单项,用IContextMenu::InvokeCommand调用相应的命令。看起来很简单不是吗?下面就以一个实例来说明具体的实现,包括怎么得到一个对象的父文件夹IShellFolder接口,怎么得到IContextMenu,及怎