将文件从TrueCrypt卷复制到剪贴板?

我使用此代码将文件复制到剪贴板:

IDataObject data = new DataObject(); data.SetData(DataFormats.FileDrop, new string[] {@"X:\test.doc"}); MemoryStream memo = new MemoryStream(4); byte[] bytes = new byte[] { (byte)(5), 0, 0, 0 }; memo.Write(bytes, 0, bytes.Length); data.SetData("Preferred DropEffect", memo); Clipboard.SetDataObject(data); 

不幸的是,如果磁盘是TrueCrypt挂载的卷,这不起作用。 在TrueCrypt卷上执行此操作的方法是什么?

不幸的是,如果没有合适的Shell ID列表,我认为你无法逃脱,在我的Windows 7上你的代码甚至不能用于常规文件系统。 正确的代码首先提供一个CIDL:

  var data = new DataObject(); var files = new StringCollection() { @"T:\Test.doc" }; data.SetFileDropList(files); data.SetData("Preferred DropEffect", true, new MemoryStream(new byte[] { 5, 0, 0, 0 })); data.SetData("Shell IDList Array", true, CreateShellIDList(files)); Clipboard.SetDataObject(data, true); 

其中CreateShellIDList创建所需的CIDA(CFSTR_SHELLIDLIST)结构的二进制表示。 实施如下:

 [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(StringCollection filenames) { // first convert all files into pidls list int pos = 0; byte[][] pidls = new byte[filenames.Count][]; foreach (var filename in filenames) { // Get pidl based on name IntPtr pidl = ILCreateFromPath(filename); 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 CIDA we will start pumping PIDLs int pidlOffset = 4 * (filenames.Count + 2); // Start the CIDA stream stream var memStream = new MemoryStream(); var sw = new BinaryWriter(memStream); // Initialize CIDA 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(var pidl in pidls) { sw.Write(pidlOffset); pidlOffset += pidl.Length; } // Write the root pidl (0) followed by all pidls sw.Write(0); foreach(var pidl in pidls) sw.Write(pidl); // stream now contains the CIDA return memStream; } 

我不能在这里得到所有的功劳,我前段时间找到了这个CIDA代码并将其移植到c#。 真的不记得原始来源,但它到目前为止运行良好(我刚刚在TrueCrypt上测试过它)