PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Coller une piece jointe Outlook 2010
Coller une piece jointe Outlook 2010
Débuté par Francis, 03 mai 2018 14:40 - 4 réponses
Membre enregistré
18 messages
Posté le 03 mai 2018 - 14:40
Bonjour,
Je cherche a enregistrer sur disque dur, des pièces jointes copiées a partir d'un mail d'outlook

En gros a partir d'un message d'outlook je fais "copier" sur une pièce jointe, je vais sur mon application, je clique sur un bouton et la pièces jointe se retrouve sur le disque dur.

Le presse papier classique ne contient pas d'info sur cela

Sur un autre forum j'ai trouvé un bout de code qui est sensé le faire mais je n'arrive pas a comprendre comment le convertir en WLangage

Pourriez vous, s'il vous plait éclairer ma lanterne ?
Il y a peut être un autre moyen

Merci d'avance

Voici le code en question

Windows stores the data IN 2 separate Clipboard-stuctures:
The data: "FileContents"
The Filename(s): "FileGroupDescriptor"

The coding is identical to the Drag AND Drop FUNCTION.
The only difference is, that in one case you find the data in the Drag-Event-parameter e (e.Data),
IN the OTHER CASE the data is stored IN the Clipboard object.

The resulting coding is as follows:

IF Clipboard.ContainsData("FileGroupDescriptor") THEN

'Get the Filename:

Dim theStream As System.IO.Stream = DirectCast(Clipboard.GetData("FileGroupDescriptor"), System.IO.Stream)
Dim fileGroupDescriptor As byte() = new byte(511) {}
theStream.Read(fileGroupDescriptor, 0, 512)

Dim fileName As new System.Text.StringBuilder("")
Dim i As Integer
i = 76
WHILE fileGroupDescriptor(i) <> 0
fileName.Append(Convert.ToChar(fileGroupDescriptor(i)))
i += 1
END WHILE
theStream.Close()

Dim theFile As string = "C:\Temp\DragAndDrop\" + fileName.ToString()

'Get the data AND save it to À file:

Dim ms As System.IO.MemoryStream = DirectCast(Clipboard.GetData("FileContents"), System.IO.MemoryStream)
Dim fileBytes As byte() = new byte(ms.Length - 1) {}
ms.Position = 0
ms.Read(fileBytes, 0, CInt(ms.Length))

Dim fs As new System.IO.FileStream(theFile, System.IO.FileMode.Create)
fs.Write(fileBytes, 0, CInt(fileBytes.Length))
fs.Close()

END IF

Cordialement
Posté le 02 juillet 2019 - 13:55
Bonjour,

Je pense que depuis, soit tu as trouvé la solution soit tu es passé à autre chose.

Je suis confronté au même besoin et ton post m'a mis sur la piste. Ce n'est pas parfait mais je joint la solution si ça peut en aider d'autre.

hwndObjet est un entier = 0
nTailleBuffer est un entier = 0
nClipBoardFormat est un entier = 0
sFormatName est une chaîne = ""
sFichierCopier est une chaîne = ""
bufBuffer est un Buffer sur 10 000 000 // Prévoir une taille suffisante pour stocker la pièce jointe

// Ouverture au Press Papier
AppelDLL32("user32", "OpenClipboard",0)

// Enumération des types présent dans le presse papier
nClipBoardFormat = AppelDLL32("user32", "EnumClipboardFormats",nClipBoardFormat)

TANTQUE nClipBoardFormat <> 0

// Lecture de du type de l'élément stoqué
nTailleBuffer = AppelDLL32("user32", "GetClipboardFormatNameA",nClipBoardFormat,&bufBuffer,255)

// Réupération de du type de l'élément stoqué
sFormatName = Tronque(bufBuffer,nTailleBuffer)

SELON sFormatName

CAS "FileGroupDescriptor"

// RECUPERATION DU FICHIER COPIÉ DEPUIS OUTLOOK
hwndObjet = AppelDLL32("user32", "GetClipboardData",nClipBoardFormat)

SI hwndObjet <> 0 ALORS

nTailleBuffer = AppelDLL32("kernel32","GlobalSize",hwndObjet)

Transfert(&bufBuffer, hwndObjet, nTailleBuffer)

sFichierCopier = Tronque(bufBuffer,nTailleBuffer)

// Suppression des caractères inutiles
sFichierCopier = Remplace(sFichierCopier,Caract(0),"")
sFichierCopier = Remplace(sFichierCopier,Caract(1),"")

FIN

CAS "FileContents"

// RECUPERATION DU CONETNU DU FICHIER COPIÉ DEPUIS OUTLOOK
hwndObjet = AppelDLL32("user32", "GetClipboardData",nClipBoardFormat)

SI hwndObjet <> 0 ALORS

// Récupération de la taille des données
nTailleBuffer = AppelDLL32("kernel32","GlobalSize",hwndObjet)

// Copie des données dans le buffer tampon
Transfert(&bufBuffer, hwndObjet, nTailleBuffer)

// Ajout du chemin
sFichierCopier = fRépertoireTemp() +[fSep()]+ sFichierCopier

// Sauvegarde du buffer final dans un fichier
fSauveBuffer(sFichierCopier,Tronque(bufBuffer,nTailleBuffer))

SINON

sFichierCopier = ""

FIN

FIN

nClipBoardFormat = AppelDLL32("user32", "EnumClipboardFormats",nClipBoardFormat)

FIN

// Fermeture au Press Papier
AppelDLL32("user32", "CloseClipboard")

// Ouverture du fichier
SI sFichierCopier <> "" ALORS LanceAppliAssociée(sFichierCopier)
Posté le 29 septembre 2020 - 08:42
Exactement ce que je cherchais.
Le code fonctionne parfaitement.
Merci!
Membre enregistré
121 messages
Popularité : +3 (3 votes)
Posté le 26 octobre 2020 - 16:16
Bonjour,
C'est bien ça merci, est-ce que ca pourrait fonctionner en glisser déplacer?
Membre enregistré
129 messages
Popularité : +20 (20 votes)
Posté le 27 octobre 2020 - 13:00
Bonjour,

Pour ma GED j'utilise la méthode suivante en DND : https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/224922-probleme-lors-tentative-recuperation-mail-outlook/read.awp…, ça permet de récupérer les pièces jointes ainsi qu'un fichier .msg sans les pj.

Par contre je viens de tester le code ci-dessus qui ne marche pas chez moi :
Le hwndObjet renvoie systématiquement 0 sur le formatName "FileContents", le code fonctionne tel quel ?