以下是获取桌面图标位置的代码。希望能获取图标名,或通过图标名获取图标位置。没分,只能在这里说声谢谢了。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); 

解决方案 »

  1.   

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

  2.   

    上面代码并不行的,::WriteProcessMemory出现有错误,并不读出桌面图标名