メモリマップドファイルで共有メモリを確保して SendMessage すればアイコン位置を取得できる.
HWND hWndDesktop;
HANDLE hFileMap;
LPVOID lpView;
POINT FAR *pos;
hFileMap = CreateFileMapping(
(HANDLE)0xFFFFFFFF,
NULL,
PAGE_READWRITE,
0,
4096,
__TEXT("ShareData"));
lpView = MapViewOfFile(hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
pos = (POINT FAR *)lpView;
SendMessage(hWndDesktop, LVM_GETITEMPOSITION, 1, (LPARAM)pos);
//
// pos->x
// pos->y
//
UnmapViewOfFile( (LPVOID)lpView );
デスクトップのウィンドウハンドル(hWndDesktop)は GetDesktopWindow() で取得するのではなく,SysListView32 から取得する.(実際にアイコンがあるウィンドウ)
hWnd = FindWindow("Progman", "Program Manager");
hWnd = FindWindowEx(hWnd, NULL, "SHELLDLL_DefView", NULL);
hWnd = FindWindowEx(hWnd, NULL, "SysListView32", NULL);
アイコンの座標(pos)はプロセス間で共有できる場所になければならない.
(共有メモリやマップドファイル)
SendMessage() の台引数はアイコンへのインデックスである.(0から)
参照