VC++如何获取桌面图标名?或通过桌面图标名获取桌面图标位置?

h490516509 2009-07-21 03:39:02
以下是获取桌面图标位置的代码。希望能获取图标名,或通过图标名获取图标位置。

没分,只能在这里说声谢谢了。

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, dwProcessId);

PVOID rc = VirtualAllocEx(hProcess, NULL, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
int m_iconCount = ListView_GetItemCount(hDeskTop);
/*在explorer.exe空间内分配内存*/
PVOID pv =VirtualAllocEx(hProcess, NULL, sizeof(POINT), MEM_COMMIT, PAGE_READWRITE);
/*给桌面ListView窗口发一LVM_GETITEMPOSITION取"我的电脑"坐标*/
ListView_GetItemPosition(hDeskTop, 9, pv);
/*把由LVM_GETITEMPOSITION获得的坐标数据复制到pt结构*/
ReadProcessMemory(hProcess, pv, &pt, sizeof(POINT), NULL);

/* 释放内存, 句柄 */
VirtualFreeEx(hProcess, pv, 0, MEM_RELEASE);
CloseHandle(hProcess);
...全文
366 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
h490516509 2009-07-29
  • 打赏
  • 举报
回复
上面代码并不行的,::WriteProcessMemory出现有错误,并不读出桌面图标名
scw121 2009-07-21
  • 打赏
  • 举报
回复
int count=(int)::SendMessage( hDestTop, LVM_GETITEMCOUNT, 0, 0);

LVITEM lvi, *_lvi;

char item[512], subitem[512];

char *_item, *_subitem;

unsigned long pid;

HANDLE process;

GetWindowThreadProcessId( hDestTop, &pid);

process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);

_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);

_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

_subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

RECT rc;

rc.left = LVIR_ICON; //这个一定要设定 可以去看MSDN关于LVM_GETITEMRECT的说明

RECT* _rc =(RECT*)VirtualAllocEx( process, NULL, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);

lvi.cchTextMax=512;

for( int i=0; i< 10; i++) {

lvi.iSubItem=0;

lvi.pszText=_item;

WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);

::SendMessage( hDestTop, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

lvi.iSubItem=1;

lvi.pszText=_subitem;

WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);

::SendMessage( hDestTop, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

::WriteProcessMemory( process, _rc, &rc, sizeof(rc), NULL);

::SendMessage( hDestTop, LVM_GETITEMRECT, (WPARAM)i, (LPARAM)_rc);

ReadProcessMemory(process, _item, item, 512, NULL);

ReadProcessMemory(process, _subitem, subitem, 512, NULL);

ReadProcessMemory(process, _rc, &rc, sizeof(rc), NULL);

CString str;

str.Format("LF:%d TP:%d RT:%d BT:%d", rc.left,rc.top,rc.right,rc.bottom);

AfxMessageBox(str);

str.Format("%s - %s\n", item, subitem);

AfxMessageBox( str );

}

VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);

VirtualFreeEx(process, _item, 0, MEM_RELEASE);

VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);

VirtualFreeEx(process, _rc, 0, MEM_RELEASE);

CloseHandle( process );

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧