桌面信息是跟explorer.exe息息相关的,我们感兴趣的信息便可以在里面找到。
获取它的句柄后,我们可以发送一系列的消息,将我们所感兴趣的信息列举下来,一系列的初始化代码:
if(((hWnd = FindWindowEx(NULL, NULL, “Progman”, NULL)) == NULL) ||
((hWnd = FindWindowEx(hWnd, NULL, “SHELLDLL_DefView”, NULL)) == NULL) ||
((hWnd = FindWindowEx(hWnd, NULL, “SysListView32″, NULL)) == NULL))
{
MessageBox(“Could not get desktop window.”);
}
这段代码不难理解,这便是要寻找桌面窗口的句柄。
接下来代码:
GetWindowThreadProcessId(hWnd, &dwPID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
pData = VirtualAllocEx(hProcess, NULL, ALLOC_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
pString = VirtualAllocEx(hProcess, NULL, ALLOC_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
pPt = VirtualAllocEx(hProcess, NULL, ALLOC_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
接着向初始化好的内存中写入:
WriteProcessMemory(hProcess, pData, &lvi, sizeof(LVITEM), &BytesWritten);
接下来便是发送消息吧。
得到桌面图标个数:
::SendMessage(hWnd, LVM_GETITEMCOUNT, (WPARAM)0, (LPARAM)0);
返回值便是一个int类型值。
获取相应图标名称:
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)count, (LPARAM)pData);
ReadProcessMemory(hProcess, pString, szText, ALLOC_SIZE, &BytesRead);
count为相应第几个图标,szText中则为存贮的信息。
获取相应图标坐标:
POINT pt;
::SendMessage(hWnd,LVM_GETITEMPOSITION,(WPARAM)count,(LPARAM)pPt);
fResult = ReadProcessMemory(hProcess, pPt, &pt, sizeof(POINT), &BytesRead);
pt即为所得。
效果如图:
原文链接:http://www.limou.net/?p=780