如何将Outlook电子邮件拖动并保存到WPF应用程序中

时间:2015-04-02 05:29:18

标签: c# wpf drag-and-drop outlook

我正在创建一个WPF应用程序。我想将Outlook中的电子邮件拖到此wpf应用程序中,应用程序需要将其保存在特定文件夹中。我尝试过使用http://www.codeproject.com/Articles/28209/Outlook-Drag-and-Drop-in-C文章。它适用于winform。我在修复所有编译时错误后尝试在WPF中使用相同的代码,但它仍无效。

我搜索了很多网页,但找不到任何解决此问题的方法。有人可以提供任何可用的示例代码吗?

4 个答案:

答案 0 :(得分:2)

!!!添加引用:“ Microsoft.Office.Interop.Outlook.dll ”!!! (在磁盘中搜索)

分析你的DragObject:

WPF:

<Window x:Class="WpfApplication1.MainWindow"
        x:Name="thisForm"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <TextBlock TextWrapping="WrapWithOverflow" Drop="ContainerDrop" DragOver="ContainerDragOver" Name="f_DropText" AllowDrop="True"/>
</Window>

C#

using System;
using System.IO;
using System.Text;
using System.Windows;
namespace WpfApplication1
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }
    private void ContainerDrop(object sender, DragEventArgs e)
    {
      f_DropText.Text = "";
      StringBuilder sb = new StringBuilder();
      foreach (string format in e.Data.GetFormats())
      {
        sb.AppendLine("Format:" + format);
        try
        {
          object data = e.Data.GetData(format);
          sb.AppendLine("Type:" + (data == null ? "[null]" : data.GetType().ToString()));
          if (format == "FileGroupDescriptor")
          {
            Microsoft.Office.Interop.Outlook.Application OL = new Microsoft.Office.Interop.Outlook.Application();
            sb.AppendLine("##################################################");
            for (int i = 1; i <= OL.ActiveExplorer().Selection.Count; i++)
            {
              Object temp = OL.ActiveExplorer().Selection[i];
              if (temp is Microsoft.Office.Interop.Outlook.MailItem)
              {
                Microsoft.Office.Interop.Outlook.MailItem mailitem = (temp as Microsoft.Office.Interop.Outlook.MailItem);
                int n=1;
                sb.AppendLine("Mail " + i + ": " + mailitem.Subject);
                foreach (Microsoft.Office.Interop.Outlook.Attachment attach in mailitem.Attachments)
                {
                  sb.AppendLine("File " + i + "."+n+": " + attach.FileName);
                  sb.AppendLine("Size " + i + "."+n+": " + attach.Size);
                  sb.AppendLine("For save using attach.SaveAsFile");
                  ++n;
                }
              }
            }
            sb.AppendLine("##################################################");
          }
          else
            sb.AppendLine("Data:" + data.ToString());
        }
        catch (Exception ex)
        {
          sb.AppendLine("!!CRASH!! " + ex.Message);
        }
        sb.AppendLine("=====================================================");
      }
      f_DropText.Text = sb.ToString();
    }
    private void ContainerDragOver(object sender, DragEventArgs e)
    {
      e.Effects = DragDropEffects.Copy;
      e.Handled = true;
    }
  }
}

答案 1 :(得分:2)

最后,我得到了这个工作。

我把这些人代码放在http://www.codeproject.com/KB/office/outlook_drag_drop_in_cs.aspx并将其修改为与WPF一起使用。

但这并不容易,因为在System.Windows的底层COM结构中几乎没有更改的构造,所以它只是通过从system.windows更改为s.w.forms.IDataObject而无效。

然后我从这个帖子中找到了这个github代码 https://social.msdn.microsoft.com/Forums/vstudio/en-US/5853bfc1-61ac-4c20-b36c-7ac500e4e2ed/how-to-drag-and-drop-email-msg-from-outlook-to-wpfor-activex-for-upload-and-send-them-out-via?forum=wpf

http://gist.github.com/521547 - 这是与WPF一起使用的新IDataObject

可以使用更正来容纳System.Windows.IDataObject而不是S.W.Forms.IDataObject和'_innerData'来查询数据,以及修复某些内存访问问题。那家伙已经钉了它!

答案 2 :(得分:1)

您不需要尝试恢复已删除的邮件项目对象,而是需要检测Outlook中的内容,然后使用System.Runtime.InteropServices.Marshal.GetActiveObject()方法连接到正在运行的Outlook实例,该方法从中获取指定对象的运行实例运行对象表(ROT)。

然后,您可以使用Explorer类的Selection属性获取Selection对象。它返回一个Selection对象,其中包含在资源管理器窗口中选择的一个或多个项目。

答案 3 :(得分:0)

 private void lbAttachments_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) || e.Data.GetDataPresent("FileGroupDescriptor") ? DragDropEffects.All : DragDropEffects.None;
        }

        private void lbAttachments_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            if (e.Data.GetDataPresent("FileGroupDescriptor"))
            {
                try {
                    var dataObject = new OutlookDataObject(e.Data);
                    var filePaths = new StringCollection();

                    string[] fileContentNames = (string[])dataObject.GetData("FileGroupDescriptor");
                    if (fileContentNames.Count() > 0)
                    {
                        var fileStreams = (MemoryStream[])dataObject.GetData("FileContents");

                        for (int fileIndex = 0; fileIndex < fileContentNames.Length; fileIndex++)
                        {
                            var ms = fileStreams[fileIndex];
                            var bytes = ms.ToArray();

                            AddAttachment(fileContentNames[fileIndex], bytes);
                        }
                    }
                }
                catch(Exception) { /* ignore */ }

            }
            else if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] s = (string[])e.Data.GetData(DataFormats.FileDrop);
                if (s == null)
                    return;

                foreach (string file in s)
                    AddAttachment(file);
            }
private void AddAttachment(string argFilename)
        {
            var daten = File.ReadAllBytes(argFilename);
            AddAttachment(argFilename, daten);
        }