Faire glisser-déposer un ou plusieurs messages D'Outlook vers l'application C# WPF

je travaille sur un client windows écrit en WPF avec C# On. Net 3.5 Sp1, où une exigence est que les données des e-mails reçus par les clients peuvent être stockées dans la base de données. En ce moment, la façon la plus facile de gérer cela est de copier et de coller le texte, le sujet, les coordonnées et le temps reçu manuellement en utilisant une quantité de CTRL-c/ctrl-V qui provoque de l'arthrite

j'ai pensé qu'une façon simple de gérer cela serait de permettre à l'utilisateur de faire glisser un ou plusieurs e-mails D'Outlook (ils sont tous en utilisant Outlook 2007 actuellement) dans la fenêtre, permettant à mon application d'extraire les informations nécessaires et de les envoyer au système d'arrière-plan pour le stockage.

cependant, quelques heures de recherche sur Google pour obtenir de l'information à ce sujet semblent indiquer un manque choquant d'information sur cette tâche apparemment élémentaire. Je pense que quelque chose comme cela serait utile dans beaucoup de contextes différents, mais tout ce que j'ai pu trouver jusqu'à présent ont été à moitié cuit, non-solutions.

quelqu'un aurait-il des conseils sur la façon de faire cela? Puisque je vais juste lire les mails et ne pas envoyer quoi que ce soit ou faire quelque chose de mal, ce serait bien avec une solution qui n'implique pas les pop ups de sécurité détestés, mais tout bat pas être en mesure de le faire du tout.

fondamentalement, si je pouvais obtenir une liste de tous les articles de courrier qui ont été sélectionnés, traîné et abandonné D'Outlook, je serai en mesure de gérer le reste moi-même!

Merci!

Rune

30
demandé sur Kent Boogaart 2008-11-25 13:14:29

5 réponses

j'ai trouvé un grand article que doit faire exactement ce que vous avez besoin.

UPDATE

j'ai pu obtenir le code dans cet article en travaillant dans WPF avec un peu de retouche, voici les changements que vous devez faire.

modifier toutes les références du système.Windows.Forme.IDataObject to System.Windows.IDataObject

dans le constructeur OutlookDataObject, changement

FieldInfo innerDataField = this.underlyingDataObject.GetType().GetField("innerData", BindingFlags.NonPublic | BindingFlags.Instance);

FieldInfo innerDataField = this.underlyingDataObject.GetType().GetField("_innerData", BindingFlags.NonPublic | BindingFlags.Instance);

Modifier tous les Formats.GetFormat appelle les DataFormats.GetDataFormat

modifier l'implémentation de SetData de

public void SetData(string format, bool autoConvert, object data)
{
    this.underlyingDataObject.SetData(format, autoConvert, data);
}

public void SetData(string format, object data, bool autoConvert)
{
    this.underlyingDataObject.SetData(format, data, autoConvert);
}

avec ces modifications, j'ai pu l'obtenir pour sauvegarder les messages dans les fichiers comme l'a fait l'article. Désolé pour le formatage, mais les listes numérotées/à puces ne fonctionnent pas bien avec les morceaux de code.

32
répondu Bryce Kahle 2009-06-10 15:11:05

j'ai trouvé beaucoup de solutions suggérant d'utiliser le "FileGroupDescriptor" pour tous les noms de fichiers et les "contenus de fichiers" sur L'objet DragEventArgs pour récupérer les données de chaque fichier. Le "FileGroupDescriptor" fonctionne très bien pour les noms de messages e-mail, mais "FileContents" renvoie un null parce que L'implémentation de L'objet IDataObject dans .Net ne peut pas gérer l'objet IStorage qui est retourné par COM.

David Ewen a une excellente explication, un excellent exemple et le téléchargement de code que fonctionne bien à http://www.codeproject.com/KB/office/outlook_drag_drop_in_cs.aspx.

5
répondu Timo 2009-06-17 11:22:12

Dans votre Xaml, vous devez configurer votre Événement:

<TextBlock
        Name="myTextBlock"  
        Text="Drag something into here"
        AllowDrop="True" 
        DragDrop.Drop="myTextBlock_Drop"
        />

une fois que vous avez défini AllowDrop = True et défini vous drop event puis allez au code derrière et configurez votre event:

private void myTextBlock_Drop(object sender, DragEventArgs e)
{
         // Mark the event as handled, so TextBox's native Drop handler is not called.
         e.Handled = true;
         Stream sr;

          //Explorer 
          if (e.Data.GetDataPresent(DataFormats.FileDrop, true))
              //Do somthing

        //Email Message Subject 
        if (e.Data.GetDataPresent("FileGroupDescriptor"))
        {
            sr = e.Data.GetData("FileGroupDescriptor") as Stream;
                StreamReader sr = new StreamReader(sr2);//new StreamReader(strPath, Encoding.Default);
            //Message Subject
                    string strFullString = sr.ReadToEnd();
         }


}

si vous souhaitez le décomposer davantage, vous pouvez utiliser: FILEDESCRIPTOR ou FILECONTENTS dans les contours suivants article

votre autre option est d'attacher dans outlooks MS Office Primary Interop Assemblies et brisez le message façon.

3
répondu cgreeno 2009-02-25 16:42:55

je pense que Style écaille de Glisser-Déposer .NET (WPF et WinForms) peut vous aider. Une fois que vous pouvez répondre à drag drop en utilisant les Interfaces COM, vous devriez être en mesure de récupérer les données outlook.

1
répondu 2008-11-25 16:16:26

je suppose que vous avez un serveur Exchange, derrière Outlook.

ce que vous pouvez faire est de récupérer le courrier du serveur Exchange et de stocker son emplacement dans votre base de données basée sur le courrier EntryID et StoreID. Voici un VB.Net snippet:

Imports Microsoft.Office.Interop

Public Class OutlookClientHandler

Private _application As Outlook.Application
Private _namespace As Outlook.NameSpace

Public Sub New()
    If Process.GetProcessesByName("outlook".ToLower).Length > 0 Then
        _application = New Outlook.Application
    Else
        Dim startInfo As ProcessStartInfo = New ProcessStartInfo("outlook.exe")
        startInfo.WindowStyle = ProcessWindowStyle.Minimized
        Process.Start(startInfo)

        _application = New Outlook.Application
    End If
End Sub

' Retrieves the specified e-mail from Outlook/Exchange via the MAPI
Public Function GetMailItem(ByVal entryID as String, ByVal storeID as String) As Outlook.MailItem
    _namespace = _application.GetNamespace("MAPI")
    Dim item As Outlook.MailItem
    Try
        item = _namespace.GetItemFromID(entryID, storeID)
    Catch comex As COMException
        item = Nothing ' Fugly, e-mail wasn't found!
    End Try

    Return item
End Function
End Class

je suppose que vous êtes à l'aise avec le MAPI, sinon vous pouvez lire ici: http://msdn.microsoft.com/en-us/library/cc765775 (v = bureau.12).aspx

pour récupérer le e-mails sélectionnés de outlook:

Public Function GetSelectedItems() As List(Of Object) 
    Dim items As List(Of Object) = New List(Of Object)

    For Each item As Object In _application.ActiveExplorer().Selection
        items.Add(item)
    Next

    Return items
End Function

après avoir récupéré les e-mails D'Outlook, vous pouvez simplement les insérer dans votre base de données! Sauver leur EntryID et StoreID (vous pourriez vouloir stocker leurs parents (le dossier) EntryID et StoreID).

1
répondu Zolomon 2011-01-11 09:52:07