(C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

接上一节: (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开

这里解释上一节中获取名称的方法

GetDisplayNameOf
定义:

void  GetDisplayNameOf(
            IntPtr pidl,
            SHGNO uFlags,
            IntPtr lpName);

该方法是用来转换PIDL成为可显示的名称字符串。PIDL必须是相对于对象的父目录的。换句话说,它必须包含一个非空的SHITEMID 结构。因为有多种命名对象的方式,资源管理器通过在uFlags参数中定义SHGNO标识的组合来表示名称类型。SHGDN_NORMAL或SHGDN_INFOLDER将被用来指定名称是相对于文件夹的还是相对于桌面的。其他三个值SHGDN_FOREDITING、SHGDN_FORADDRESSBAR和SHGDN_FORPARSING可以用来指定名称的用途。 名称必须按STRRET的结构形式返回,如果SHGDN_FOREDITING、SHGDN_FORADDRESSBAR和 SHGDN_FORPARSING没有设定,就返回外壳对象的显示名称。

具体实现方法:

/// <summary>
        
/// 获取显示名称
        
/// </summary>

         public   static   string  GetNameByIShell(IShellFolder Root, IntPtr pidlSub)
        
{
            IntPtr strr 
= Marshal.AllocCoTaskMem(MAX_PATH * 2 + 4);
            Marshal.WriteInt32(strr, 
00);
            StringBuilder buf 
= new StringBuilder(MAX_PATH);
            Root.GetDisplayNameOf(pidlSub, SHGNO.INFOLDER, strr);
            API.StrRetToBuf(strr, pidlSub, buf, MAX_PATH);
            Marshal.FreeCoTaskMem(strr);
            
return buf.ToString();
        }

 

SHGNO

事实上,只要修改 SHGNO ,就可以获取其绝对路径:

/// <summary>
        
/// 根据路径获取 IShellFolder 和 PIDL
        
/// </summary>

         public   static  IShellFolder GetShellFolder(IShellFolder desktop,  string  path,  out  IntPtr Pidl)
        
{
            IShellFolder IFolder;
            
uint i, j = 0;
            desktop.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, path, 
out i, out Pidl, ref j);
            desktop.BindToObject(Pidl, IntPtr.Zero, 
ref Guids.IID_IShellFolder, out IFolder);
            
return
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值