技术开发 频道

(C#)Windows Shell 外壳编程系列4


执行菜单命令

    能不能不弹出菜单直接调用菜单项相应的命令?答案是肯定的。

    大家还记得怎么显示一个文件或文件夹的属性对话框吗?

    Yes,用ShellExecuteEx并指定SHELLEXECUTEINFO的lpVerb域为properties就可,但是这种方法只能查看一个文件的属性,怎么同时查看多个的?

    要知道ShellExecuteEx查看文件属性最终也是靠IContextMenu帮忙的,所以答案还是在IContextMenu上,我们只要在调用GetUIObjectOf时把想查看的文件或文件件的PIDL做为参数传进去,然后直接调用InvokeCommand方法就OK啦。

    当然,我们做的例子,还是弹出一个对象的属性,靠你自己修改了。

    我们必须先得到 IContextMenu 接口:
//得到 IContextMenu 接口 IntPtr iContextMenuPtr = IntPtr.Zero; iContextMenuPtr = IParent.GetUIObjectOf(IntPtr.Zero, (uint)pidls.Length, pidls, ref Guids.IID_IContextMenu, out iContextMenuPtr); IContextMenu iContextMenu = (IContextMenu)Marshal.GetObjectForIUnknown(iContextMenuPtr);
    但我们不弹出这个菜单,仅仅是调用 InvokeCommand 来执行命令而已:
//直接执行命令 CMINVOKECOMMANDINFOEX invoke = new CMINVOKECOMMANDINFOEX(); invoke.cbSize = Marshal.SizeOf(typeof(CMINVOKECOMMANDINFOEX)); invoke.lpVerb = Marshal.StringToHGlobalAnsi("properties"); invoke.lpDirectory = string.Empty; invoke.fMask = 0; invoke.nShow = 1; iContextMenu.InvokeCommand(ref invoke);
    关于verb的更多信息请参考MSDN。我这里做的是执行“属性”,如果你要执行其他命令,或者按照索引来执行,也是可以的。这里不做深入研究。


源代码:/Files/lemony/WinShell4.rar

 


0
相关文章