Перетаскивание C# из Outlook с использованием .NET 4.5 или более поздней версииC#

Место общения программистов C#
Ответить
Anonymous
 Перетаскивание C# из Outlook с использованием .NET 4.5 или более поздней версии

Сообщение Anonymous »

Есть ли у кого-нибудь код C# для поддержки перетаскивания из Outlook в приложение Winforms, которое работает под .Net Framework 4.5 или более поздней версии?

У меня есть код, который используется уже около 12 лет и включает возможность перетаскивания элементов, включая электронные письма, из Outlook.

В коде есть работал отлично при компиляции с установленным для Target Framework значением .Net Framework 4, однако для некоторых новых функций, над которыми я работал, требуется .Net Framework 4.5 или более поздняя версия. Однако это мешает перетаскиванию из Outlook.

Код довольно запутанный, он выполняет массу действий, не связанных с проблемой, чтобы определить, куда идет файл, и для кого это отображается и т. д., поэтому я не буду включать все это, но момент, в котором это ломается, приятен и прост...

Код: Выделить всё

public string ImportEmail(DragEventArgs e)
{
string strResult = string.Empty;
var dataObject = new OutlookDataObject(e.Data);
var filenames = (string[]) dataObject.GetData("FileGroupDescriptor");
В .NET 4 последняя строка выше возвращает ожидаемые имена файлов.

В .NET 4.5 или более поздней версии последняя строка выше возвращает null.

Я проверял это под .NET 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2 и 4.7.2 (все версии, которые я установил), ни на одной из них не работает.

Я несколько дней рылся в этом коде, пробуя весь код перетаскивания, который смог найти, и, похоже, ни один из них не работает под .Net 4.5 или более поздней версии.

Ниже приведен полный код тестовой формы, которую я создал с использованием кода, который нашел здесь и в других местах. Этот код прекрасно работает в .Net Framework 4, независимо от того, перетаскиваете ли вы файл или электронное письмо из Outlook, но ни один из них не работает в .Net Framework 4.5 или более поздних версиях (проверено снова все те же версии).

Код: Выделить всё

using System;
using System.IO;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Reflection;
using System.Windows.Forms;

namespace OutlookDragNDropTest
{
public partial class OutlookDragNDropTest : Form
{
public OutlookDragNDropTest()
{
InitializeComponent();
}

private void Form1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
//    or this tells us if it is an Outlook attachment drop
else if (e.Data.GetDataPresent("FileGroupDescriptor"))
{
e.Effect = DragDropEffects.Copy;
}
//    or none of the above
else
{
e.Effect = DragDropEffects.None;
}
}

private void Form1_DragDrop(object sender, DragEventArgs e)
{
try
{
//wrap standard IDataObject in OutlookDataObject
OutlookDataObject dataObject = new OutlookDataObject(e.Data);

//get the names and data streams of the files dropped
string[] filenames = (string[])dataObject.GetData("FileGroupDescriptor");
MemoryStream[] filestreams = (MemoryStream[])dataObject.GetData("FileContents");

string tempPath = Path.GetTempPath();

for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++)
{
//use the fileindex to get the name and data stream
string filename = tempPath + filenames[fileIndex];
MemoryStream filestream = filestreams[fileIndex];

//save the file stream using its name to the application path
FileStream outputStream = File.Create(filename);
filestream.WriteTo(outputStream);
outputStream.Close();
MessageBox.Show("Output to " + filename);
}
}
catch (Exception ex)
{
MessageBox.Show("Error : " + ex.ToString());
}
}
}
}
(ОК, кажется, код слишком длинный для одного сообщения, класс OutlookDataObject будет в ответе ниже)...
Единственное, что еще есть, — это сама форма, которая представляет собой просто пустую форму Winforms со следующими установленными свойствами: -

AllowDrop: True

Событие DragEnter: Form1_DragEnter

Событие DragDrop: Form1_DragDrop

Если это актуально, я использую Visual Studio 2017 Professional и запускаю в Windows 10, хотя клиенты, работающие под управлением Windows 7, также сообщали о том, что перетаскивание не работает.

Подробнее здесь: https://stackoverflow.com/questions/581 ... 5-or-later
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»