title: C# WinForms: Identify type of drag-drop action event
body: <p><strong>The use case:</strong> users need the ability to drag &amp; drop email items from Outlook onto a form in my WinForms (.Net 4) application. The application saves these items in .msg format and stores them in a predetermined location.</p>
  
  <p><strong>The problem:</strong> my code is not robust against drag-drop from other sources (e.g. dragging a jpeg from IE onto the form triggers the same event). This is because I cannot determine whether the dragged item is an Outlook object, or what source the dragged item(s) came from.</p>
  
  <p><strong>Is there a workaround such that I can only accept drag-drop items of a particular type?</strong> Here is my code in the DragDrop event handler:</p>
  
  <pre><code>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;
  }
  </code></pre>
  
  <p>Some details on the DragEventArgs object (e) when dragging from Outlook:</p>
  
  <pre><code>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"
  </code></pre>