2017-05-07 4 views
3

J'essaie de copier un fichier audio dans le presse-papiers en C# en utilisant un chemin de fichier. Le problème que je rencontre est qu'il ne copie pas, ou ne copie pas correctement car il ne peut pas être collé en dehors de l'application.WPF C# Copier le fichier audio dans le presse-papiers

Voici comment je suis en train de le copier dans le presse-papiers:

b_array = File.ReadAllBytes(fileLocation); 
Clipboard.Clear(); 
Clipboard.SetAudio(b_array); 

la fileLocation variable dans mes tests équivaut à quelque chose comme: C: \ Users \ ben \ Musique \ Samples \ kick_05.wav

+0

Vous attendez-vous à être en mesure de coller ce fichier dans l'explorateur Windows, par exemple? Avec ce code, vous pouvez seulement coller (je pense, jamais essayé audio) dans une application qui comprend le format audio, donc un éditeur audio de quelque sorte. –

+0

@AlexPaven J'essaie de faire en sorte que vous puissiez coller le fichier à peu près partout (explorateur de fichiers et programmes d'édition audio) presque comment la fonction de copie fonctionne dans l'explorateur de fichiers. –

+1

Je n'ai pas beaucoup d'expérience avec le presse-papiers mais je pense que vous devez insérer une entrée séparée avec les informations du fichier, sinon il n'y aurait aucun moyen de connaître le nom du fichier et l'emplacement de copie - voir Clipboard.SetFileDropList Je –

Répondre

5

Plus besoin de lire le contenu du fichier. Vous pouvez ajouter le fichier directement dans le presse-papier en utilisant le SetFileDropList

StringCollection files = new StringCollection(); 
files.Add(fileLocation); 
Clipboard.SetFileDropList(files); 
+0

essayé de faire cela et il a lancé une exception: System.Runtime.InteropServices.COMException: 'Échec OpenClipboard (exception de HRESULT: 0x800401D0 (CLIPBRD_E_CANT_OPEN))' –

+0

vous essayez de le faire dans un thread d'arrière-plan? Je suis assez sûr que cela doit se produire sur le fil de l'interface utilisateur. J'ai vu des problèmes où l'utiliser dans un Task.Run lancerait une exception –

+0

Je le fais définitivement sur le fil de l'interface utilisateur. Je l'ai même enveloppé dans ceci pour m'assurer et j'ai le même problème: this.Dispatcher.Invoke (() => {...}); –