ListView_GetItemPosition : Gets the position of a list-view item
理论上获得桌面图标的正确方法是使用shell项,=> IFolderView::GetItemPosition
但是为了学习ListView_GetItemPosition的一些有用的知识,故写下来留作回顾。
因为我们要访问的桌面ListView与我们的应用程序存在的过程(Process)不同,所以我们所需要的POINT(由
ListView_GetItemPosition提供)
必须分配在拥有ListView的同一进程的地址空间中。
因此我们可以使用VirtualAllocEx()
进行内存分配,然后使用该内存请求位置,然后使用ReadProcessMemory()
将POINT
数据从该内存读取到我们自己的进程中。
一些代码:
int numberOfIcons = ListView_GetItemCount(folderView);
printf("Number Of Icons On Desktop is: %d\n", numberOfIcons);
if (numberOfIcons > 0)
{
DWORD pid = 0;
GetWindowThreadProcessId(folderView, &pid);
HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, FALSE, pid);
if (!hProcess)
{
printf("OpenProcess failed, error %u\n", GetLastError());
}
else
{
LPPOINT pt = (LPPOINT) VirtualAllocEx(hProcess, NULL, sizeof(POINT), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (!pt)
{
printf("VirtualAllocEx failed, error %u\n", GetLastError());
}
else
{
POINT iconPos;
SIZE_T numRead;
for (int i = 0; i < numberOfIcons; ++i)
{
if (!ListView_GetItemPosition(folderView, i, pt))
{
printf("GetItemPosition failed for index %d\n", i);
continue;
}
if (!ReadProcessMemory(hProcess, pt, &iconPos, sizeof(POINT), &numRead))
{
printf("ReadProcessMemory failed for index %d, error %u\n", i, GetLastError());
continue;
}
printf("Icon at Index %d, Position = %ld, %ld", i, iconPos.x, iconPos.y);
}
VirtualFreeEx(hProcess, pt, 0, MEM_RELEASE);
}
CloseHandle(hProcess);
}
}
注:ListView_GetItemPosition不能保证桌面图标在listview控件中