2017-09-13 7 views
2

J'ai un programme sur lequel je dois pouvoir copier et coller depuis un ordinateur distant vers mon ordinateur local.Pourquoi Clipboard.GetFileDropList() retourne une collection vide sur le Bureau à distance?

Mon problème est, quand j'utilise

Clipboard.GetDropList(); 

retourne une collection avec 0 éléments, peu importe le nombre d'éléments que j'ai essayé de copier.

Je l'ai essayé avec:

if (Clipboard.ContainsFileDropList()) 
{ 
    foreach (string item in Clipboard.GetFileDropList()) 
    { 
     File.Copy(item, path + '\\' + Path.GetFileName(item)); 
    } 
} 

J'ai aussi essayé (BoltBait's answer):

System.Collections.Specialized.StringCollection idat = null; 
Exception threadEx = null; 
Thread staThread = new Thread(
    delegate() 
    { 
     try 
     { 
      idat = Clipboard.GetFileDropList(); 
     } 
     catch (Exception ex) 
     { 
      threadEx = ex; 
     } 
    }); 
staThread.SetApartmentState(ApartmentState.STA); 
staThread.Start(); 
staThread.Join(); 

Les deux versions retournent une collection vide.

D'où le problème pourrait-il provenir? Sachant que:

  • Copier/coller de distance au niveau local (via Windows) fonctionne
  • Copier/coller de la section locale Local (via le code) fonctionne
  • partage
  • Presse-papiers est activé
  • OS (local) : Windows 10
  • OS (à distance): Windows Server 2008 R2

Répondre

0

la raison pour laquelle vous obtenez une collection vide est le fait que le presse-papier ne contient pas de données i n le format DataFormats.FileDrop. Au lieu de cela, lors de la copie de certains fichiers sur une machine distante via Remote Desktop (lorsque le partage du presse-papiers est activé), le contenu du fichier sera placé directement dans le Presse-papiers. Le presse-papier contiendra les données dans les formats suivants:

Alors vous pourriez théoriquement essayez de parcourir les objets FILEGROUPDESCRIPTOR et stockez chaque fichier en lisant son CFSTR_FILECONTENTS dans le presse-papiers.

Mais j'ai trouvé un bug report décrivant que cela ne fonctionne que pour le premier fichier dans Windows Forms. Vous devrez donc l'implémenter en utilisant P/Invoke en appelant les méthodes natives.

+0

Lorsque j'essaie d'accéder à FileContents, j'obtiens une exception (CLIPBRD_E_BAD_DATA HRESULT: 0x800401D3) (J'utilise GetData ("FileContents")). Y a-t-il une autre méthode que je devrais utiliser? – user3399

+0

Malheureusement, cela n'est pas bien supporté par l'implémentation de 'Clipboard' dans .NET. Vous devez passer à une approche non gérée - soit via P/Invoke ou en créant votre propre module non géré. Pour plus de détails, voir [cette rubrique] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb776904%28v=vs.85%29.aspx#filecontents). – dymanoid