CRY6666 2017-08-03 02:58 采纳率: 0%
浏览 909

在获取桌面图标时,,为啥取不到句柄???别人电脑可以我的不可以???

void C***::OnSetDeskIcon()

{

HWND hDestTop;

hDestTop = ::FindWindow("progman", NULL);

    //????????????????????????????????????????????????????????????
hDestTop = ::FindWindowEx(hDestTop, 0, "shelldll_defview", NULL);   

hDestTop = ::FindWindowEx(hDestTop, 0, "syslistview32", NULL);   
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条回答 默认 最新

  • shen_wei 2017-08-03 09:29
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发