相关疑难解决方法(0)

尝试从 Chrome 实现拖放 Gmail 附件

我一直在尝试将 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)

c# shell drag-and-drop google-chrome winforms

6
推荐指数
1
解决办法
1315
查看次数

C# WPF - 将远程文件拖放到 Windows 资源管理器

我正在开发一个 WPF 应用程序,它显示存储在远程服务器上的文件列表(就像保管箱一样)。我希望用户将它们拖放到桌面或任何文件夹上。有很多与此相关的问题,但没有一个真正给出完整的解决方案。

这是我正在使用的完整代码https://github.com/dotriz/VirtualDragDrop/

截屏

如果文件存储在本地系统上,这是一个非常简单的任务,但这里的文件位于远程服务器上,需要先下载。

唯一与此相关的文章是 13 年前发布的https://dlaa.me/blog/post/9923072。它也有一些问题,比如

  • 当我们将它拖到 Windows 资源管理器上时,它在调试模式下会出错,但当我们直接运行 exe 时工作正常。可能是什么问题?

无效的 FORMATETC 结构(HRESULT 异常:0x80040064 (DV_E_FORMATETC)

  • 如果我们将文件拖到 Slack 等应用程序中,它会在文件下载时挂起。但当文件拖放到 Windows 资源管理器时,工作正常(如果我们直接运行 exe)。

以下是标签的 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 drag-and-drop

6
推荐指数
1
解决办法
561
查看次数

将大型虚拟文件从C#拖放到Windows资源管理器中

我有一个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)

c# com drag-and-drop

5
推荐指数
1
解决办法
2941
查看次数

标签 统计

c# ×3

drag-and-drop ×3

com ×1

google-chrome ×1

shell ×1

winforms ×1

wpf ×1