C# SHMultiFileProperties查看多个文件属性

来源:互联网 发布:淘宝如何修改店铺名 编辑:程序博客网 时间:2024/05/01 01:44
[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);

原创粉丝点击