Рабочий стол - это просто элемент управления ListView, и вы можете получить его дескриптор и отправить ему сообщения для перемещения значков с помощью LVM_SETITEMPOSITION.
Однако получить позиции значков с помощью LVMGETITEMPOS немного сложнее. Вы должны передать указатель на структуру POINT в качестве LPARAM. Если вы попытаетесь это сделать, вы, скорее всего, завершите работу Explorer. Проблема в том, что вы передали ему указатель в адресном пространстве, который элемент управления интерпретировал как указатель в адресном пространстве проводника. Ой!
Решение, которое я использовал, заключается в том, чтобы внедрить DLL в процесс Explorer и отправить оттуда сообщение. Тогда вам просто нужен способ вернуть информацию о позиции в ваш процесс.