J'ai créé un volet de tâches personnalisé de base dans Outlook.

Je souhaite faire glisser un e-mail et le déposer dans le volet Office. Lorsqu'il est déposé, il devrait me permettre de capturer l'e-mail comme un objet je suppose, me permettant de faire des choses avec lui, comme dans un enregistrement dans un emplacement de sharepoint par exemple.

Est-ce possible? Si oui, des pointeurs?

J'utilise VS2013 C # .NET 4.0 et le complément est pour Outlook 2010/2013.

11
oshirowanen 21 avril 2017 à 16:47

3 réponses

Meilleure réponse

Prérequis et configuration

  • Windows 10 Pro
  • Visual Studio 2013 Ultimate avec développement Office
  • Outlook 2013 avec un compte de messagerie

Projet

  • Dans Visual Studio, sélectionnez Nouveau projet -> Visual C # -> Office / SharePoint -> Compléments Office -> Complément Outlook 2013
  • Faites un clic droit sur le projet -> Ajouter -> Contrôle utilisateur
  • Ouvrez "ThisAddIn.cs" et ajoutez le code suivant à la méthode "ThisAddIn_Startup":

    var myCustomPane= this.CustomTaskPanes.Add(new UserControl1(), "My Pane");
    myCustomPane.Visible = true;
    

Outlook 2013 Custom Pane

Glisser et déposer des messages

  • Double-cliquez sur UserControl1 dans l'Explorateur de solutions. Cela ouvre la fenêtre du concepteur.
  • Dans Propriétés, définissez AllowDrop = True et connectez deux gestionnaires d'événements DragDrop et DragEnter .

    private void UserControl1_DragEnter(object sender, DragEventArgs e)
    {
        // if you want to read the message data as a string use this:
        if (e.Data.GetDataPresent(DataFormats.UnicodeText))
        {
            e.Effect = DragDropEffects.Copy;
        }
        // if you want to read the whole .msg file use this:
        if (e.Data.GetDataPresent("FileGroupDescriptorW") && 
            e.Data.GetDataPresent("FileContents"))
        {
            e.Effect = DragDropEffects.Copy;
        }
    }
    
    private void UserControl1_DragDrop(object sender, DragEventArgs e)
    {
        // to read basic info about the mail use this:
        var text = e.Data.GetData(DataFormats.UnicodeText).ToString();
        var message = text.Split(new string[] { "\r\n" }, StringSplitOptions.None)[1];
        var parts = message.Split('\t');
        var from = parts[0]; // Email From
        var subject = parts[1]; // Email Subject
        var time = parts[2]; // Email Time
    
        // to get the .msg file contents use this:
        // credits to "George Vovos", http://stackoverflow.com/a/43577490/1093508
        var outlookFile = e.Data.GetData("FileGroupDescriptor", true) as MemoryStream;
        if (outlookFile != null)
        {
            var dataObject = new iwantedue.Windows.Forms.OutlookDataObject(e.Data);
    
            var filenames = (string[])dataObject.GetData("FileGroupDescriptorW");
            var filestreams = (MemoryStream[])dataObject.GetData("FileContents");
    
            for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++)
            {
                string filename = filenames[fileIndex];
                MemoryStream filestream = filestreams[fileIndex];
    
                // do whatever you want with filestream, e.g. save to a file:
                string path = Path.GetTempPath() + filename;
                using (var outputStream = File.Create(path))
                {
                    filestream.WriteTo(outputStream);
                }
            }
        }
    }
    

Vous pouvez obtenir "iwantedue.Windows.Forms.OutlookDataObject" à partir de CodeProject ou vous pouvez utiliser ce GitHub Gist.

Démo

Outlook 2013 Custom Pane Drag and drop email message

5
Dávid Molnár 27 avril 2017 à 06:52

Essayez quelque chose comme ça

        public static string[] GetDropedFiles(DragEventArgs e)
        {
            string[] files = null;
            var outlookFile = e.Data.GetData("FileGroupDescriptor", true) as MemoryStream;
            if (outlookFile != null)
            {
                OutlookEmailObject dataObject = new OutlookEmailObject(e.Data);

                var filenames = (string[])dataObject.GetData("FileGroupDescriptorW");
                var filestreams = (MemoryStream[])dataObject.GetData("FileContents");

                files = new string[filenames.Length];
                for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++)
                {
                    string filename = filenames[fileIndex];
                    MemoryStream filestream = filestreams[fileIndex];

                    string path = Path.GetTempPath();
                    string fullFileName = path + filename;

                    FileStream outputStream = File.Create(fullFileName);
                    filestream.WriteTo(outputStream);
                    outputStream.Close();

                    files[fileIndex] = fullFileName;
                }
            }
            else
                files = (string[])e.Data.GetData(DataFormats.FileDrop);

            return files;
        }

Vous pouvez obtenir la classe OutlookEmailObject ici (Téléchargez l'exemple de code):
http://www.codeproject.com/Articles/ 28209 / Outlook-Glisser-déposer-dans-C

(Bien sûr, vous devez supprimer tous les fichiers temporaires une fois que vous avez terminé)

0
George Vovos 24 avril 2017 à 09:22

Vous pouvez obtenir l'élément déposé ou plusieurs éléments (si autorisé) en vérifiant le Selection propriété de la classe Explorer. En savoir plus à ce sujet dans les articles suivants:

0
Eugene Astafiev 23 avril 2017 à 22:10