Bonjour .
Avec ce code j'ai la liste des icones du bureau
void GetIcon(){
// récupération plateforme d'exécution
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if(osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS &&
osvi.dwPlatformId != VER_PLATFORM_WIN32_NT)
{
return;
}
//-----------------------------------------------------------------------------------
// récupération ListView avec les icones du bureau, récupération de son processus
HWND hWnd = FindWindow(_T("ProgMan"), NULL);
HWND hListView = GetTopWindow(GetTopWindow(hWnd));
DWORD dwProcessId;
GetWindowThreadProcessId(hListView, &dwProcessId);
DWORD dwAccess = PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE;
HANDLE hProcess = OpenProcess(dwAccess, FALSE, dwProcessId);
if(hProcess == NULL)
return;
// allocation d'une chaînes de caractères, d'une stucture LVITEM et d'une structure
// POINT dans le processus de la listview ou dans la zone partagée (Windows 98)
DWORD dwSize = sizeof(POINT) + sizeof(LVITEM) + 256*sizeof(TCHAR);
HANDLE hFileMapping = NULL;
LPVOID lpData = NULL;
// Windows 98 : création FileMapping
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
hFileMapping = CreateFileMapping((HANDLE) 0xFFFFFFFF, NULL,
PAGE_READWRITE|SEC_COMMIT, 0, dwSize, NULL);
if(hFileMapping != NULL)
lpData = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, dwSize);
}
// Windows NT : VirtualAllocEx
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
lpData = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
}
// en cas d'erreur
if(lpData == NULL)
{
if(hFileMapping != NULL)
CloseHandle(hFileMapping);
CloseHandle(hProcess);
return;
}
// affectation des pointeurs
LPVOID lpPosition = lpData;
LPVOID lpItem = ((LPBYTE) lpData) + sizeof(POINT);
LPVOID lpText = ((LPBYTE) lpData) + sizeof(POINT) + sizeof(LVITEM);
//-----------------------------------------------------------------------------------
// création nom du fichier d'initialisation
TCHAR szIniFileName[_MAX_PATH];
GetModuleFileName(NULL, szIniFileName, _MAX_PATH);
GetLongPathName(szIniFileName, szIniFileName, _MAX_PATH);
PathRenameExtension(szIniFileName, _T(".ini"));
// boucle sur les items de la ListView
int nItemCount = SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);
TCHAR szCount[32];
wsprintf(szCount, _T("%d"), nItemCount);
WritePrivateProfileString(_T("Icons"), _T("ItemCount"), szCount, szIniFileName);
for(int i = 0; i < nItemCount; i++)
{
// init structure LVITEM dans une variable locale et recopie dans la zone de
// mémoire allouée
LVITEM lvi;
ZeroMemory(&lvi, sizeof(LVITEM));
lvi.iItem = i;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = (LPTSTR) lpText;
lvi.cchTextMax = 256;
WriteProcessMemory(hProcess, lpItem, &lvi, sizeof(LVITEM), NULL);
lvi.iImage
// récupération nom et position
SendMessage(hListView, LVM_GETITEMTEXT, i, (LPARAM) lpItem);
SendMessage(hListView, LVM_GETITEMPOSITION, i, (LPARAM) lpPosition);
// recopie dans variables locales
TCHAR szText[256];
ReadProcessMemory(hProcess, lpText, szText, 256*sizeof(TCHAR), NULL);
POINT ptPosition;
ReadProcessMemory(hProcess, lpPosition, &ptPosition, sizeof(POINT), NULL);
// ajout de la position et du nom
TCHAR szKey[256];
wsprintf(szKey, _T("Item%02d"), i);
TCHAR szValue[256];
wsprintf(szValue, _T("\"%s\" %d %d"), szText, ptPosition.x, ptPosition.y);
WritePrivateProfileString(_T("Icons"), szKey, szValue, szIniFileName);
}
//-----------------------------------------------------------------------------------
// libération mémoire
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
UnmapViewOfFile(lpData);
CloseHandle(hFileMapping);
}
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
VirtualFreeEx(hProcess, lpData, 0, MEM_RELEASE);
}
// fermeture processus
CloseHandle(hProcess);
MessageBox(Desk, _T("Position des icones sauvegardée"),
_T("DektopUtility"), MB_ICONINFORMATION);
}
Cela marche j'ai les noms et les positions de chaques icones.
Je voudrai savoir s'il serait possible d'avoir les images des icones (les mettre dans un HBITMAP par exemple).
Merci a vous.