Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开
【标  题】:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开
【关键字】:C#,Windows,Shell
【来  源】:http://blog.csdn.net/lc_mtt/archive/2007/04/17/1567247.aspx

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

Your Ad Here (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~)

接上一篇:(C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹

让我们详细解释一下 Shell 编程中最基本的一些函数、结构体和枚举。

SHGetDesktopFolder
获取桌面的 IShellFolder 接口

[DllImport("shell32.dll")]
        
public static extern Int32 SHGetDesktopFolder(out IntPtr ppshf);

要使用这个函数,必须先定义一个 IntPtr 指针。然后通过指针,使用 GetObjectForIUnknown 返回通过指向 COM 对象的 IShellFolder 接口的指针实例。于是需要编写以下函数:

public static IShellFolder GetDesktopFolder(out IntPtr ppshf)
        
{
            SHGetDesktopFolder(
out ppshf);
            Object obj 
= Marshal.GetObjectForIUnknown(ppshf);
            
return (IShellFolder)obj;
        }

ParseDisplayName
获得对象的PIDL,即便对象在目录树中处于当前目录下一层或更多层。例如,对于文件对象来说,它的解析名就是它的路径,我们用文件系统对象的完全路径名来调用桌面的IshellFolder接口的 ParseDisplayName 方法,它会返回这个对象的完全PIDL。定义:
void ParseDisplayName(
            IntPtr hwnd,
            IntPtr pbc,
            [MarshalAs(UnmanagedType.LPWStr)] 
string pszDisplayName,
            
out uint pchEaten,
            
out IntPtr ppidl,
            
ref uint pdwAttributes);

里面最重要的参数就是 out IntPtr ppidl 了,它返回 pszDisplayName 指定路径对应的 PIDL。然而仅仅是 PIDL 并不能让你做更多的事情。这时候还需要调用 BindToObject 来返回 IShellFolder 接口。

BindToObject
根据 PIDL 创建和初始化 IShellFolder 对象。定义:

void BindToObject(
            IntPtr pidl,
            IntPtr pbc,
            [In()] 
ref Guid riid,
            
out IShellFolder ppv);

里面有一个 [In()] ref Guid riid 参数,表示接口的接口标识符 (IID)。GUID其实就是一个唯一的标识符。世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。我们这里使用 IID_IShellFolder 表示它获取的是一个 IShellFolder 接口。

public static Guid IID_IShellFolder = new Guid("{000214E6-0000-0000-C000-000000000046}");

另外介绍 IEnumIDList 接口。IEnumIDList 接口使资源管理器获得文件夹包含的全部对象的PIDL,PIDL然后可以用来获得这些对象的信息。

因此,我们使用 EnumObjects 函数返回的将是 IEnumIDList 的指针:

int EnumObjects(IntPtr hWnd, SHCONTF flags, out IntPtr enumIDList);

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

SHCONTF

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

获取名称

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

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

例2

照例,附图片和源代码:



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

下一节将讲述 Shell 编程中的 IContextMenu ,也就是上下文菜单,将使你的应用程序列举 Shell 对象的同时,还能在右键操控它们的菜单。
在Delphi中实现图片的旋转、缩放:【上一篇】
(C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹:【下一篇】
【相关文章】
  • (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
  • C#操作存储过程,输入参数,返回结果
  • Windows Animated Cursor Handling 漏洞解决方法 及 漏洞生成程序.
  • C#中调用Windows API时的数据类型对应关系
  • C# 特性(Attribute)入门
  • 从vc++ 到 visual c#.net
  • 《给初学者的Windows Vista的补遗手册》之075
  • 《给初学者的Windows Vista的补遗手册》之076
  • C# 画圆角矩形
  • 拯救Windows XP操作系统崩溃的救命稻草
  • 【随机文章】
  • 几个国外域名解析网站
  • linux 高手帮忙解决一下 万分感谢
  • 手动脱壳之UPX V1.01的壳
  • 编译FC1内核
  • 鼻炎的器质性病变:鼻息肉和鼻中隔偏曲
  • txt文件绑定到DataGrid
  • arg list too long
  • A memery management interface---Source code_except.h
  • [导入]Common Ground 国际双行线
  • 变换显示数据库图片(2/3)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.