This is how to use Virtual Alloc et al to avoid having to subclass the desktop
in NT, 2000 and that family of operating systems.  Iconoid uses the DLL because
The dll method works in both win9x and NT
The showcursor functions requires that ShowCursor be run in the LV process.
The interception of WM_SETTINGCHANGED requires subclassing the LV.
As of Iconoid Version 3.2, transparency is done in the DLL also (intercepting WM_PAINT)
so this becomes moot.

void SetIconPosition(int a,POINT ptInput)
{
    DWORD         dwProcessId;
    HWND          hListView = GetDeskTopListView();

    GetWindowThreadProcessId(hListView, &dwProcessId);

    HANDLE        hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, 
        FALSE, dwProcessId);

    if (hProcess == NULL)
    {
        MessageBox(hDialog, __TEXT("Could not communicate with process"), "", MB_OK|MB_ICONWARNING);
    } 
    else
    {
        POINT         ptP;

        ptP = ptInput;

        LPPOINT       ptRemotePoint = (LPPOINT)VirtualAllocEx(hProcess, NULL, 4096, MEM_RESERVE|
            MEM_COMMIT, PAGE_READWRITE);
        WriteProcessMemory(hProcess, ptRemotePoint, &ptP, sizeof(POINT), NULL);

        SendMessage(hListView, LVM_SETITEMPOSITION32, a, (LONG)ptRemotePoint);
        WriteProcessMemory(hProcess, ptRemotePoint, &ptP, sizeof(POINT), NULL);

// how to get data from the desktop lv:

        SendMessage(hListView, LVM_GETITEMPOSITION, a, (LONG)ptRemotePoint);
        WriteProcessMemory(hProcess, ptRemotePoint, &ptP, sizeof(POINT), NULL);

        VirtualFreeEx(hProcess, ptRemotePoint, 0, MEM_RELEASE);

    } 
    CloseHandle(hProcess);
}