Récupération/écriture des noms de fichiers contenus dans le presse-papier

Description

VB permet de lire facilement certains contenus du presse-papier windows (texte, image ...), mais pour ce qui est des noms de fichier, c'est une autre histoire. (par exemple, lors d'un copier-coller de fichiers dans l'explorateur windows)

J'ai donc fouillé un peu partout et j'ai trouvé ces bouts de code que j'ai un peu dépoussiéré.
Comme je pense que cela peut être utile à d'autres, et que je n'ai rien trouvé de similaire ici, voici le code :

Source / Exemple :


Option Explicit

Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags&, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop As Long, ByVal iFile As Long, ByVal lpszFile As String, ByVal cch As Long) As Long

Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
Private Const CF_HDROP As Long = 15

Private Type POINTAPI
  x As Long
  y As Long
End Type

Private Type DROPFILES
  pFiles As Long
  pt As POINTAPI
  fNC As Long
  fWide As Long
End Type

Public Function ClipboardGetFiles(file_names() As String) As Boolean
Dim drop_handle As Long
Dim num_file_names As Long
'Dim file_names() As String
Dim file_name As String * 1024
Dim i As Long
If Clipboard.GetFormat(vbCFFiles) Then
  If OpenClipboard(0) Then
  drop_handle = GetClipboardData(CF_HDROP)
  If drop_handle = 0 Then
    ClipboardGetFiles = False
    CloseClipboard
    Exit Function
  End If
  ' nombre de noms de fichier dans le presse-papier
  num_file_names = DragQueryFile(drop_handle, -1, _
                vbNullString, 0)
  ' récupération des noms de fichier
  ReDim file_names(1 To num_file_names) As String
  For i = 1 To num_file_names
    DragQueryFile drop_handle, i - 1, _
                   file_name, Len(file_name)
    ' On coupe au niveau du caractère null
    file_names(i) = Left$(file_name, InStr(file_name, vbNullChar) - 1)
  Next
  ' fermeture du presse-papier (important)
  CloseClipboard
  ClipboardGetFiles = True
  End If
Else
  ClipboardGetFiles = False
End If
End Function

' copie des noms de fichiers dans le presse-papier
' retourne vrai en cas de réussite
Public Function ClipboardSetFiles(file_names() As String) As Boolean
Dim file_string As String
Dim drop_files As DROPFILES
Dim memory_handle As Long
Dim memory_pointer As Long
Dim i As Long
'  on vide le presse-papier
Clipboard.Clear
If OpenClipboard(0) Then
  ' construit une liste de noms de fichier terminés par null
  For i = LBound(file_names) To UBound(file_names)
    file_string = file_string & file_names(i) & vbNullChar
  Next i
  file_string = file_string & vbNullChar
  ' Initialise la structure DROPFILES
  drop_files.pFiles = Len(drop_files)
  drop_files.fWide = 0    ' ANSI characters.
  drop_files.fNC = 0      ' Client coordinates.

  ' réservation mémoire pour DROPFILES et la liste des noms de fichier
  memory_handle = GlobalAlloc(GHND, Len(drop_files) + Len(file_string))
  If memory_handle Then
    memory_pointer = GlobalLock(memory_handle)
   
   ' copie en mémoire de la strucure et des noms de fichier
   CopyMem ByVal memory_pointer, drop_files, Len(drop_files)
   CopyMem ByVal memory_pointer + Len(drop_files), ByVal file_string, Len(file_string)
   GlobalUnlock memory_handle
   
   ' copie des données vers le presse-papier
   SetClipboardData CF_HDROP, memory_handle
   ClipboardSetFiles = True
  Else
    ClipboardSetFiles = False
  End If
  CloseClipboard
Else
  ClipboardSetFiles = False
End If
End Function

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.