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

Soyez le premier à donner votre avis sur cette source.

Vue 5 837 fois - Téléchargée 298 fois

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

Ajouter un commentaire

Commentaires

Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
pas de lien entre ces deux actions....
Fixnyl
Messages postés
11
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
8 décembre 2013
1 -
Attention tout de même car si on fait une copie de fichiers ils sont déplacés.
Plus d'explication : Allez dans l'explorateur copier une séries de fichiers utiliser se bout de code dans VB :

Dim Tfiles() As String

If ClipboardGetFiles(Tfiles()) = True Then

For i = 1 To UBound(Tfiles)
nfiles = nfiles & Tfiles(i) & vbCrLf
Next

MsgBox nfiles

ClipboardSetFiles Tfiles()

End If

Puis utiliser la fonction Coller dans l'explorateur, à ce moment là les fichiers sont déplacer.
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
certes, ce mix instructions VB / API n'est pas très heureux...

passes en tout APIs, pour le coup
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
If Clipboard.GetFormat(vbCFFiles) Then
If OpenClipboard(0) Then
.....

Pas très productif tout ça.
Clipboard.GetFormat(vbCFFiles)
C'est déjà:
OpenClipboard(0)
IsClipboardFormatAvailable(CF_HDROP)
CloseClipboard()
oommeeggaa3d
Messages postés
98
Date d'inscription
dimanche 24 avril 2005
Statut
Membre
Dernière intervention
3 septembre 2010
-
Merci, je ne connaissais pas "join".

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.