Drag n drop plus

Soyez le premier à donner votre avis sur cette source.

Vue 10 321 fois - Téléchargée 744 fois

Description

Ce programme effectue une copie de fichiers à l'aide d'un glisser-déposer (drag and drop).
Le principe est simple:
Le programme se compose de deux zones de listes, vous glissez les fichiers à copier dans la première, ensuite vous glissez les fichiers de la liste vers un dossier de destination et enfin la copie se fait en affichant la progression dans la deuxième zone de liste.

Le drag and drop est effectué avec la technologie OLE, le chemin de destination est retrouvé grâce à des fonctions non documentées et avec un hook WM_GETMESSAGE.

Conclusion :


J'ai fait cet exemple pour maitriser le drag and drop et mettre au point la méthode pour retrouver le chemin de destination. J'utiliserai cet exemple pour mon application SilverScan (Logiciel de recherche de fichiers sur un réseau), allez sur mon site si vous voulez suivre son développement (www.thebestof.tk ou marcplouhinec.free.fr section PROJETS/REALISATIONS).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Elles datent du shell32.dll V5 apparu avec Win2000 fin 1999.
Messages postés
10
Date d'inscription
dimanche 11 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2009

En fait c'est comme ça qu'on les appelle quand je les ai trouvées sur internet, elles ne sont ni dans shell32.lib ni dans la doc msdn sur CD (elle date de visual c++ 6). Peut-être que microsoft les a rajouté après.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Messages postés
10
Date d'inscription
dimanche 11 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2009

Salut,
Voici ma fonction utilisant les fonctions non-documentées:

char *ShellGetPath()
{
POINT pt;
GetCursorPos(&pt);
HWND hwndListView = WindowFromPoint(pt);
char nom[255];
GetWindowText(hwndListView,nom,255);

if(strcmp(nom,"FolderView") != 0)
{
return NULL;
}

//On est dans l'explorateur, dans la liste des fichiers
//On regarde si on n'est pas sur un dossier
char DossierSelectionne[255];
ZeroMemory(DossierSelectionne,255);

if(ListView_GetHotItem(hwndListView) != -1)
{
//On est sur un fichier
OpenClipboard(NULL);
EmptyClipboard();
CloseClipboard();

HookGetItemText();//Le hook envoie les données dans le presse papier

HANDLE hgbl = NULL;

//On attend que les données arrivent dans le presse papier
while(IsClipboardFormatAvailable(CF_TEXT) == NULL);

OpenClipboard(NULL);

hgbl = GetClipboardData(CF_TEXT);

char *string = (char*)GlobalLock(hgbl);
strcpy(DossierSelectionne,string);

EmptyClipboard();
CloseClipboard();

UnHook();
}


char *Chemin = new char[1000];

HWND hWnd = hwndListView;
while(GetParent(hWnd)!=0)
hWnd = GetParent(hWnd);


GetWindowText(hWnd,nom,255);

if(strcmp(nom,"Program Manager") == 0)
{
//On est dans le bureau
strcpy(Chemin,getenv("USERPROFILE"));
if(strcmp(DossierSelectionne,"Mes documents") != 0)
strcat(Chemin,"\\Bureau");
}
else
{

HINSTANCE hShell32;
FARPROC SHFreeShared2;
FARPROC SHLockShared2;
FARPROC SHUnlockShared2;
FARPROC ILClone2;


hShell32 = LoadLibrary("shell32.dll");
SHFreeShared2 = GetProcAddress(hShell32, "SHFreeShared");
SHLockShared2 = GetProcAddress(hShell32, "SHLockShared");
SHUnlockShared2 = GetProcAddress(hShell32, "SHUnlockShared");
ILClone2 = GetProcAddress(hShell32, "ILClone");



LPITEMIDLIST result = NULL;

DWORD pid = GetCurrentProcessId();
HANDLE hMem = (HANDLE)SendMessage(hWnd, CWM_GETPATH, pid, 0);
if (hMem)
{
LPVOID pv = ((LPVOID (WINAPI *)(HANDLE, DWORD))SHLockShared2)((void **)hMem, pid);


if (pv)
{
result = ((LPITEMIDLIST ( WINAPI*)(LPCITEMIDLIST))ILClone2)((LPCITEMIDLIST)pv);
((BOOL (WINAPI *)(LPVOID))SHUnlockShared2)(pv);
}
((BOOL (WINAPI *)(HANDLE, DWORD))SHFreeShared2)(hMem, pid);
}


SHGetPathFromIDList(result,Chemin);

FreeLibrary(hShell32);
}
if(DossierSelectionne[0]!=0)
{
//On teste si c'est bien un dossier ou si c'est un fichier
char temp[1000];
strcpy(temp,Chemin);
strcat(temp,"\");
strcat(temp,DossierSelectionne);

FILE *stream;
stream = fopen(temp,"r");
if(stream == NULL)
{
//C'est un dossier
strcat(Chemin,"\");
strcat(Chemin,DossierSelectionne);
}
else
{
//C'est un fichier
fclose(stream);
}
}

return Chemin;
}


Les fonctions sont:
SHFreeShared
SHLockShared
SHUnlockShared
ILClone

A cela il faut ajouter la définition:
#define CWM_GETPATH (WM_USER+12)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Salut,

peux-tu indiquer quelles sont les fonctions non documentées que tu emploies ?

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.