How to programmatically move icons' location from Windows Desktop? How to programmatically move icons' location from Windows Desktop? windows windows

How to programmatically move icons' location from Windows Desktop?


Desktop is an ordinary listview so you can use windows api to move items to different locations. Have a look at this similar question: How can I programmatically manipulate Windows desktop icon locations?


I come late, but this piece of code works for me and I hope it may help somebody. It's in c++17.

#include <windows.h>#include <commctrl.h>#include <ShlObj.h>int desktop_shuffle() {    // You must get the handle of desktop's listview and then you can reorder that listview (which contains the icons).    HWND progman = FindWindow(L"progman", NULL);    HWND shell = FindWindowEx(progman, NULL, L"shelldll_defview", NULL);    HWND hwndListView = FindWindowEx(shell, NULL, L"syslistview32", NULL);    int nIcons = ListView_GetItemCount(hwndListView);    POINT* icon_positions = new POINT[nIcons];    // READ THE CURRENT ICONS'S POSITIONS    if (nIcons > 0) {        // We must use desktop's virtual memory to get the icons positions, otherwise you won't be able to        // read their x, y positions.        DWORD desktop_proc_id = 0;        GetWindowThreadProcessId(hwndListView, &desktop_proc_id);        HANDLE h_process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, FALSE, desktop_proc_id);        if (!h_process)        {            printf("OpenProcess: Error while opening desktop UI process\n");            return -1;        }        LPPOINT pt = (LPPOINT)VirtualAllocEx(h_process, NULL, sizeof(POINT), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);        if (!pt)        {            CloseHandle(h_process);            printf("VirtualAllocEx: Error while allocating memory in desktop UI process\n");            return -1;        }        for (int i = 0; i < nIcons; i++)        {            if (!ListView_GetItemPosition(hwndListView, i, pt))            {                printf("GetItemPosition: Error while retrieving desktop icon (%d) position\n", i);                continue;            }            if (!ReadProcessMemory(h_process, pt, &icon_positions[i], sizeof(POINT), nullptr))            {                printf("ReadProcessMemory: Error while reading desktop icon (%d) positions\n", i);                continue;            }        }        VirtualFreeEx(h_process, pt, 0, MEM_RELEASE);        CloseHandle(h_process);    }    // UPDATE THE ICONS'S POSITIONS    for (int i = 0; i < nIcons; i++) {        ListView_SetItemPosition(hwndListView, i, rand(), rand());    }    return 0;}