频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

Windows Shell 开发:从“桌面”开始展开

来源: 作者:柠檬的 出处:巧巧读书 2008-01-23 进入讨论组
上一页 1 2 
访问 http://www.qqread.com/csharp/j394035.html
  因此,我们使用 EnumObjects 函数返回的将是 IEnumIDList 的指针:

Windows Shell 开发:从“桌面”开始展开(图一)
int EnumObjects(IntPtr hWnd, SHCONTF flags, out IntPtr enumIDList);

其中 flags 是 SHCONTF 枚举类型,它决定了枚举的内容:

Windows Shell 开发:从“桌面”开始展开(图三) Windows Shell 开发:从“桌面”开始展开(图二) SHCONTF

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> Windows Shell 开发:从“桌面”开始展开(图一) public enum SHCONTF
Windows Shell 开发:从“桌面”开始展开(图二) Windows Shell 开发:从“桌面”开始展开(图三)      Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)         FOLDERS = 0x20,
Windows Shell 开发:从“桌面”开始展开(图五)         NONFOLDERS = 0x40,
Windows Shell 开发:从“桌面”开始展开(图五)         INCLUDEHIDDEN = 0x80,
Windows Shell 开发:从“桌面”开始展开(图五)         INIT_ON_FIRST_NEXT = 0x100,
Windows Shell 开发:从“桌面”开始展开(图五)         NETPRINTERSRCH = 0x200,
Windows Shell 开发:从“桌面”开始展开(图五)         SHAREABLE = 0x400,
Windows Shell 开发:从“桌面”开始展开(图五)         STORAGE = 0x800
Windows Shell 开发:从“桌面”开始展开(图六)     }

因此,我们可以通过 flags 的不同来分别列举子文件和子目录。这里会遇到一个问题,怎么获取 PIDL 对象的名称呢。这里编写了2个函数,可以通过 PIDL 或者 IShellFolder 返回对象的名称(详细解释留到下一节):

Windows Shell 开发:从“桌面”开始展开(图三) Windows Shell 开发:从“桌面”开始展开(图二) 获取名称

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> Windows Shell 开发:从“桌面”开始展开(图二) Windows Shell 开发:从“桌面”开始展开(图三) /**//// <summary>
Windows Shell 开发:从“桌面”开始展开(图五)         /// 获取显示名称
Windows Shell 开发:从“桌面”开始展开(图六)         /// </summary>
Windows Shell 开发:从“桌面”开始展开(图一)         public static string GetNameByIShell(IShellFolder Root, IntPtr pidlSub)
Windows Shell 开发:从“桌面”开始展开(图二) Windows Shell 开发:从“桌面”开始展开(图三)          Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)             IntPtr strr = Marshal.AllocCoTaskMem(MAX_PATH * 2 + 4);
Windows Shell 开发:从“桌面”开始展开(图五)             Marshal.WriteInt32(strr, 0, 0);
Windows Shell 开发:从“桌面”开始展开(图五)             StringBuilder buf = new StringBuilder(MAX_PATH);
Windows Shell 开发:从“桌面”开始展开(图五)             Root.GetDisplayNameOf(pidlSub, SHGNO.INFOLDER, strr);
Windows Shell 开发:从“桌面”开始展开(图五)             API.StrRetToBuf(strr, pidlSub, buf, MAX_PATH);
Windows Shell 开发:从“桌面”开始展开(图五)             return buf.ToString();
Windows Shell 开发:从“桌面”开始展开(图六)         }
Windows Shell 开发:从“桌面”开始展开(图一)
Windows Shell 开发:从“桌面”开始展开(图二) Windows Shell 开发:从“桌面”开始展开(图三)         /**//// <summary>
Windows Shell 开发:从“桌面”开始展开(图五)         /// 根据 PIDL 获取显示名称
Windows Shell 开发:从“桌面”开始展开(图六)         /// </summary>
Windows Shell 开发:从“桌面”开始展开(图一)         public static string GetNameByPIDL(IntPtr pidl)
Windows Shell 开发:从“桌面”开始展开(图二) Windows Shell 开发:从“桌面”开始展开(图三)          Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)             SHFILEINFO info = new SHFILEINFO();
Windows Shell 开发:从“桌面”开始展开(图五)             API.SHGetFileInfo(pidl, 0, ref info, Marshal.SizeOf(typeof(SHFILEINFO)),
Windows Shell 开发:从“桌面”开始展开(图五)                 SHGFI.PIDL | SHGFI.DISPLAYNAME | SHGFI.TYPENAME);
Windows Shell 开发:从“桌面”开始展开(图五)             return info.szDisplayName;
Windows Shell 开发:从“桌面”开始展开(图六)         }

例子二,从“桌面”开始展开

这个例子将使你深入理解之前的内容。它是这样的一个例子,允许你从“桌面”开始,一直展开到最深层的对象。

Windows Shell 开发:从“桌面”开始展开(图三) Windows Shell 开发:从“桌面”开始展开(图二) 例2

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> Windows Shell 开发:从“桌面”开始展开(图一) public partial class Sample2 : Form
Windows Shell 开发:从“桌面”开始展开(图二) Windows Shell 开发:从“桌面”开始展开(图三)      Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)         private IShellFolder deskTop;
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)         public Sample2()
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)          Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)             InitializeComponent();
Windows Shell 开发:从“桌面”开始展开(图九)         }
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)         private void Form1_Load(object sender, EventArgs e)
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)          Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)             //获得桌面 PIDL
Windows Shell 开发:从“桌面”开始展开(图五)             IntPtr deskTopPtr;
Windows Shell 开发:从“桌面”开始展开(图五)             deskTop = API.GetDesktopFolder(out deskTopPtr);
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)             //添加 桌面 节点
Windows Shell 开发:从“桌面”开始展开(图五)             TreeNode tnDesktop = new TreeNode("桌面");
Windows Shell 开发:从“桌面”开始展开(图五)             tnDesktop.Tag = deskTop;
Windows Shell 开发:从“桌面”开始展开(图五)             tnDesktop.Nodes.Add(" Windows Shell 开发:从“桌面”开始展开(图四) ");
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)             //把节点添加到树中
Windows Shell 开发:从“桌面”开始展开(图五)             Tree1.Nodes.Add(tnDesktop);
Windows Shell 开发:从“桌面”开始展开(图五)             tnDesktop.Expand();
Windows Shell 开发:从“桌面”开始展开(图九)         }
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)         private void Tree1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)          Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图八) Windows Shell 开发:从“桌面”开始展开(图七)             判断节点是否已经展开#region 判断节点是否已经展开
Windows Shell 开发:从“桌面”开始展开(图五)             if (e.Node.Nodes.Count != 1)
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)              Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)                 return;
Windows Shell 开发:从“桌面”开始展开(图九)             }
Windows Shell 开发:从“桌面”开始展开(图五)             else
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)              Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)                 if (e.Node.FirstNode.Text != " Windows Shell 开发:从“桌面”开始展开(图四) ")
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)                  Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)                     return;
Windows Shell 开发:从“桌面”开始展开(图九)                 }
Windows Shell 开发:从“桌面”开始展开(图九)             }
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)             e.Node.Nodes.Clear(); 
Windows Shell 开发:从“桌面”开始展开(图九)             #endregion
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)             IShellFolder root = (IShellFolder)e.Node.Tag;
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)             //循环查找子项
Windows Shell 开发:从“桌面”开始展开(图五)             IEnumIDList Enum = null;
Windows Shell 开发:从“桌面”开始展开(图五)             IntPtr EnumPtr = IntPtr.Zero;
Windows Shell 开发:从“桌面”开始展开(图五)             IntPtr pidlSub;
Windows Shell 开发:从“桌面”开始展开(图五)             int celtFetched;
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图五)             if (root.EnumObjects(this.Handle, SHCONTF.FOLDERS, out EnumPtr) == API.S_OK)
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)              Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)                 Enum = (IEnumIDList)Marshal.GetObjectForIUnknown(EnumPtr);
Windows Shell 开发:从“桌面”开始展开(图五)                 while (Enum.Next(1, out pidlSub, out celtFetched) == 0 && celtFetched == API.S_FALSE)
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)                  Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)                     string name = API.GetNameByIShell(root, pidlSub);
Windows Shell 开发:从“桌面”开始展开(图五)                     IShellFolder iSub;
Windows Shell 开发:从“桌面”开始展开(图五)                     root.BindToObject(pidlSub, IntPtr.Zero, ref Guids.IID_IShellFolder, out iSub);
Windows Shell 开发:从“桌面”开始展开(图五)                     
Windows Shell 开发:从“桌面”开始展开(图五)                     TreeNode nodeSub = new TreeNode(name);
Windows Shell 开发:从“桌面”开始展开(图五)                     nodeSub.Tag = iSub;
Windows Shell 开发:从“桌面”开始展开(图五)                     nodeSub.Nodes.Add(" Windows Shell 开发:从“桌面”开始展开(图四) ");
Windows Shell 开发:从“桌面”开始展开(图五)                     e.Node.Nodes.Add(nodeSub);
Windows Shell 开发:从“桌面”开始展开(图九)                 }
Windows Shell 开发:从“桌面”开始展开(图九)             }
Windows Shell 开发:从“桌面”开始展开(图九)         }
Windows Shell 开发:从“桌面”开始展开(图五)         
Windows Shell 开发:从“桌面”开始展开(图五)         private void Sample2_FormClosing(object sender, FormClosingEventArgs e)
Windows Shell 开发:从“桌面”开始展开(图七) Windows Shell 开发:从“桌面”开始展开(图八)          Windows Shell 开发:从“桌面”开始展开(图四) {
Windows Shell 开发:从“桌面”开始展开(图五)             //释放资源
Windows Shell 开发:从“桌面”开始展开(图五)             Marshal.ReleaseComObject(deskTop);
Windows Shell 开发:从“桌面”开始展开(图九)         }
Windows Shell 开发:从“桌面”开始展开(图五)
Windows Shell 开发:从“桌面”开始展开(图六)     }

照例,附图片和源代码:

Windows Shell 开发:从“桌面”开始展开(图十)



源代码:WinShell2.rar

下一节将讲述 Shell 编程中的 IContextMenu ,也就是上下文菜单,将使你的应用程序列举 Shell 对象的同时,还能在右键操控它们的菜单。 更多文章 更多内容请看Windows操作系统安装Windows权限设置Windows操作系统安全集专题,或进入讨论组讨论。
上一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章