У меня есть код, который используется уже около 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.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());
}
}
}
}
Единственное, что еще есть, — это сама форма, которая представляет собой просто пустую форму 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
Мобильная версия