获取桌面图标位置. 2k, 98 方法不同.
////////////////// for NT based /////////////////////
/* 取桌面 ListView 的句柄 */
HWND hDeskTop;
hDeskTop = FindWindow("progman", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "shelldll_defview", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "syslistview32", NULL);
/* 取 explorer.exe 句柄. 注意 OpenProcess 的参数 */
DWORD dwProcessId;
GetWindowThreadProcessId(hDeskTop, &dwProcessId);
HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_OPERATION, FALSE, dw
ProcessId);
/* 在 explorer.exe 空间内分配内存 */
PVOID pv = VirtualAllocEx(hProcess, NULL, sizeof(POINT), MEM_COMMIT, PAGE_READW
RITE);
/* 给桌面 ListView 窗口发一 LVM_GETITEMPOSITION 取 "我的电脑" 坐标 */
ListView_GetItemPosition(hDeskTop, 1, pv);
/* 把由 LVM_GETITEMPOSITION 获得的坐标数据复制到 pt 结构 */
POINT pt;
ReadProcessMemory(hProcess, pv, &pt, sizeof(POINT), NULL);
/* 释放内存, 句柄 */
VirtualFreeEx(hProcess, pv, 0, MEM_RELEASE);
CloseHandle(hProcess);
////////////////// for 9x /////////////////////
/* 取桌面 ListView 的句柄 */
HWND hDeskTop;
hDeskTop = FindWindow("progman", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "shelldll_defview", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "syslistview32", NULL);
/* 分配一共享内存 */
HANDLE hmm = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, s
izeof(POINT), NULL);
POINT * ppt;
ppt = (POINT *)MapViewOfFile(hmm, FILE_MAP_ALL_ACCESS, 0, 0, 0);
/* 给桌面 ListView 窗口发一 LVM_GETITEMPOSITION 取 "我的电脑" 坐标 */
ListView_GetItemPosition( hDeskTop, 0, ppt);
/* 释放内存. 对 ppt 的操作要在这之前做. */
UnmapViewOfFile(ppt);
CloseHandle(hmm);
不同版本的 EXPLORER 中, "我的电脑" 可能有不同的 index, 就是传给 ListView_GetItem
Position 的第 2 个参数. 2000 下是 1, 98 下似乎是 0.