我一直在尝试将 Gmail 附件从 Chrome 拖放到我的应用程序中。
可以将文件从电子邮件拖到桌面并在那里创建附件,所以我知道这一定是可能的。
我已经能够让它读取文件名,但是当我从数据对象读取 FileContents 时,我得到一个带有该文件链接的互联网快捷方式。
有人以前做过这个工作吗?目前的代码是针对 .txt 文件进行硬编码的
我的主要 DataObjectWrapper 类如下:
字符太多,无法全部发布,但主要方法是:
public object GetDataNative(string format, bool autoConvert)
{
switch (format)
{
case CFSTR_FILEDESCRIPTOR_A:
IntPtr fileGroupDescriptorAPointer = IntPtr.Zero;
try
{
//use the underlying IDataObject to get the FileGroupDescriptor as a MemoryStream
MemoryStream fileGroupDescriptorStream = (MemoryStream)this.underlyingDataObject.GetData(CFSTR_FILEDESCRIPTOR_A, autoConvert);
byte[] fileGroupDescriptorBytes = new byte[fileGroupDescriptorStream.Length];
fileGroupDescriptorStream.Read(fileGroupDescriptorBytes, 0, fileGroupDescriptorBytes.Length);
fileGroupDescriptorStream.Close();
//copy the file group descriptor into unmanaged memory
fileGroupDescriptorAPointer = Marshal.AllocHGlobal(fileGroupDescriptorBytes.Length);
Marshal.Copy(fileGroupDescriptorBytes, 0, fileGroupDescriptorAPointer, fileGroupDescriptorBytes.Length);
//marshal the unmanaged memory to to …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 WPF 应用程序,它显示存储在远程服务器上的文件列表(就像保管箱一样)。我希望用户将它们拖放到桌面或任何文件夹上。有很多与此相关的问题,但没有一个真正给出完整的解决方案。
这是我正在使用的完整代码https://github.com/dotriz/VirtualDragDrop/
如果文件存储在本地系统上,这是一个非常简单的任务,但这里的文件位于远程服务器上,需要先下载。
唯一与此相关的文章是 13 年前发布的https://dlaa.me/blog/post/9923072。它也有一些问题,比如
无效的 FORMATETC 结构(HRESULT 异常:0x80040064 (DV_E_FORMATETC)
以下是标签的 MouseDown 事件中使用的代码。它使用上面给出的链接中的VirtualFileDataObject类
private void VirtualFile2_MouseButtonDown(object sender, MouseButtonEventArgs e)
{
var virtualFileDataObject = new VirtualFileDataObject();
virtualFileDataObject.SetData(new VirtualFileDataObject.FileDescriptor[]
{
new VirtualFileDataObject.FileDescriptor
{
Name = "test.zip",
ChangeTimeUtc = DateTime.Now.AddDays(-1),
StreamContents = stream =>
{
using(var webClient = new WebClient())
{
var data = webClient.DownloadData("https://somesite.com/test.zip");
stream.Write(data, 0, data.Length);
}
}
},
});
DoDragDropOrClipboardSetDataObject(e.ChangedButton, VirtualFile2, …Run Code Online (Sandbox Code Playgroud) 我有一个C#WPF应用程序,其中一个部分用作FTP客户端,列出远程服务器上的文件并允许用户下载它们.我希望用户能够将文件列表中的文件拖放到他们自己的机器上(即进入Windows资源管理器外壳).
为了实现这一点,我使用了Delay的博客中的VirtualFileDataObject代码,使用了Action<Stream>重载SetData.这适用于较小的文件.
我的问题是:我正在处理的一些文件非常大(2+ GB),并且VirtualFileDataObject类处理流的方式涉及将整个内容读入内存,最终会导致"存储空间不足"错误对于那些非常大的文件.
VirtualFileDataObject代码的相关部分如下.如何重写此代码以不要求整个流在内存中?
public void SetData(short dataFormat, int index, Action<Stream> streamData) {
_dataObjects.Add(
new DataObject {
FORMATETC = new FORMATETC {
cfFormat = dataFormat,
ptd = IntPtr.Zero,
dwAspect = DVASPECT.DVASPECT_CONTENT,
lindex = index,
tymed = TYMED.TYMED_ISTREAM
},
GetData = () => {
// Create IStream for data
var ptr = IntPtr.Zero;
var iStream = NativeMethods.CreateStreamOnHGlobal(IntPtr.Zero, true);
if (streamData != null) {
// Wrap in a .NET-friendly …Run Code Online (Sandbox Code Playgroud)