您的位置:首页 > 编程语言 > C#

C# SHMultiFileProperties查看多个文件属性

2013-05-23 10:54 381 查看
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SHMultiFileProperties(IDataObject pdtobj, int dwFlags);
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr ILCreateFromPath(string path);
[DllImport("shell32.dll", CharSet = CharSet.None)]
public static extern void ILFree(IntPtr pidl);
[DllImport("shell32.dll", CharSet = CharSet.None)]
public static extern int ILGetSize(IntPtr pidl);

private static MemoryStream CreateShellIDList(System.Collections.Specialized.StringCollection filenames)
{
// first convert all files into pidls list
int pos = 0;
byte[][] pidls = new byte[filenames.Count][];
foreach (Object filename in filenames)
{
// Get pidl based on name
IntPtr pidl = ILCreateFromPath(filename.ToString());
int pidlSize = ILGetSize(pidl);
// Copy over to our managed array
pidls[pos] = new byte[pidlSize];
Marshal.Copy(pidl, pidls[pos++], 0, pidlSize);
ILFree(pidl);
}

// Determine where in CIDL we will start pumping PIDLs
int pidlOffset = 4 * (filenames.Count + 2);
// Start the CIDL stream
MemoryStream memStream = new MemoryStream();
BinaryWriter sw = new BinaryWriter(memStream);
// Initialize CIDL witha count of files
sw.Write(filenames.Count);
// Calcualte and write relative offsets of every pidl starting with root
sw.Write(pidlOffset);
pidlOffset += 4; // root is 4 bytes
foreach (byte[] pidl in pidls)
{
sw.Write(pidlOffset);
pidlOffset += pidl.Length;
}

// Write the root pidl (0) followed by all pidls
sw.Write(0);
foreach (byte[] pidl in pidls) sw.Write(pidl);
// stream now contains the CIDL
return memStream;
}

//调用:
string[] strArr = new string[] { @"C:\Lee", @"c:\windows" };
System.Collections.Specialized.StringCollection coll = new System.Collections.Specialized.StringCollection();
coll.AddRange(strArr);
DataObject data = new DataObject();
data.SetData("Preferred DropEffect", true, new MemoryStream(new byte[] { 5, 0, 0, 0 }));
data.SetData("Shell IDList Array", true, CreateShellIDList(coll));
data.SetFileDropList(coll);
SHMultiFileProperties(data, 0);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: