Получение нескольких вложений Outlook из буфера обмена

Я пытаюсь получить несколько вложений Outlook из буфера обмена.

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

Я знаю, что имена файлов можно найти в IDataObject с помощью CLIPFORMAT CFSTR_FILEDESCRIPTOR который содержит имена виртуальных объектов. Кроме того, я из того, что я понимаю, содержимое файла получает с использованием CLIPFORMAT CFSTR_FILECONTENTS, Но когда я это делаю, я получаю только один файл, и я не понимаю, как мне получить другие файлы, которые были скопированы в буфер обмена.

Я обнаружил, что с помощью lindex член в FORMATETC Я могу получить другие файлы, но по какой-то причине это не работает.

Может кто-нибудь объяснить или привести пример, как я могу получить другие вложения (предпочитая C++)?

1 ответ

Решение

Взгляните на пример перетаскивания в CodeProject Outlook. Оно использует IDataObject в классе оболочки OutlookDataObject, но это тот же интерфейс, который используется в буфере обмена. В C# вы можете сделать следующее...

// IDataObject wrapper
OutlookDataObject dataObject = new OutlookDataObject(Clipboard.GetDataObject());

// retrieving filenames
string[] filenames = (string[])dataObject.GetData("FileGroupDescriptorW");
this.label1.Text = "filenames:\n    " + string.Join(",", filenames) + "\n";

// writing out file contents
MemoryStream[] filestreams = (MemoryStream[])dataObject.GetData("FileContents");

this.label1.Text += "Files:\n";
for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++)
{
    //use the fileindex to get the name and data stream
    string filename = filenames[fileIndex];
    MemoryStream filestream = filestreams[fileIndex];
    this.label1.Text += "    " + filename + "\n";

    //save the file stream using its name to the application path
    FileStream outputStream = File.Create(filename);
    filestream.WriteTo(outputStream);
    outputStream.Close();
}

Глядя на OutlookDataObject класс-обертка, вы должны быть в состоянии реализовать нечто подобное в C++.

Другие вопросы по тегам