ユースケース:ユーザーはOutlookからドロップする電子メールアイテムをWinForms(.Net 4)アプリケーションのフォームにドラッグする機能が必要です。アプリケーションはこれらの項目を.msg形式で保存し、それらを所定の場所に保存します。C#WinForms:ドラッグドロップアクションイベントのタイプを確認
問題:私のコードは、他のソースからのドラッグ・ドロップに対して堅牢ではありません(IEからフォームへjpegをドラッグすると同じイベントがトリガーされます)。これは、ドラッグされたアイテムがOutlookオブジェクトであるか、ドラッグされたアイテムがどのソースから来たのかを判断できないためです。
特定のタイプのドラッグドロップ項目のみ受け入れることができるような回避策がありますか?ここは、DragDropイベントハンドラの中で私のコードです:
Outlook.Application outlook = new Outlook.Application();
Outlook.Selection sel = outlook.ActiveExplorer().Selection;
try
{
foreach (object item in sel)
{
if (item is Outlook.MailItem)
{
var mail = item as Outlook.MailItem;
CopyMailItemToLocalTempDir(mail);
txtComment.Text = "Email from " + mail.SenderName + " Regarding " + mail.Subject;
}
}
}
finally
{
// This is hokey but it prevents Outlook from remembering previously selected items
// - refer http://stackoverflow.com/questions/14090420/interop-outlook-doesnt-clear-selected-mails-at-drag-and-drop
var folder = outlook.ActiveExplorer().CurrentFolder;
outlook.ActiveExplorer().CurrentFolder = outlook.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts);
Thread.Sleep(50);
outlook.ActiveExplorer().CurrentFolder = folder;
Marshal.ReleaseComObject(sel);
Marshal.ReleaseComObject(outlook);
sel = null;
outlook = null;
}
OutlookからドラッグDragEventArgsオブジェクト(e)の上のいくつかの詳細:
e.Data.GetFormats() returns:
{string[15]}
[0]: "RenPrivateSourceFolder"
[1]: "RenPrivateLatestMessages"
[2]: "RenPrivateMessages"
[3]: "RenPrivateItem"
[4]: "FileGroupDescriptor"
[5]: "FileGroupDescriptorW"
[6]: "FileDrop"
[7]: "FileNameW"
[8]: "FileName"
[9]: "FileContents"
[10]: "Object Descriptor"
[11]: "System.String"
[12]: "UnicodeText"
[13]: "Text"
[14]: "CSV"
e.Data.GetData("Text") returns:
"From\tSubject\tReceived\tSize\tCategories\t\r\nJoe Sender\tThis is the email subject\t10:51 AM\t3 KB\t\t"
はまだ私の質問に明確な答えを見つけることができますが、この記事では、最も近い来ました:http://www.codeproject.com/Articles/28209/Outlook-Drag-and- Drop-in-C –