我正在创建一个WPF应用程序。我想将Outlook中的电子邮件拖到此wpf应用程序中,应用程序需要将其保存在特定文件夹中。我尝试过使用http://www.codeproject.com/Articles/28209/Outlook-Drag-and-Drop-in-C文章。它适用于winform。我在修复所有编译时错误后尝试在WPF中使用相同的代码,但它仍无效。
我搜索了很多网页,但找不到任何解决此问题的方法。有人可以提供任何可用的示例代码吗?
答案 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);
}