首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

获取CListCtrl控件文本内容解决办法

2012-01-24 
获取CListCtrl控件文本内容由于需要获取CListCtrl控件文本内容(控件属性为Report),通过阅读资料,以下代码

获取CListCtrl控件文本内容
由于需要获取CListCtrl控件文本内容(控件属性为Report),通过阅读资料,以下代码经过测试可行:测试方式:自己建立一个基于对话框的程序,添加CListCtrl控件(控件属性为Report),再向其中添加一些项目,测试以下代码,可以正确读出其内容.

  问题:当我把该代码应用与"迅雷"时(想要获取其CListCtrl控件文本内容),却失败了.调试发现错误在于这句:
HWND listview=::FindWindowEx(hwnd,NULL,"SysListView32",NULL); 
返回为NULL. 但是通过Spy++可以看见迅雷5该控件确实是SysListView32.
  想要知道如何解决这个问题???

代码:
HWND hwnd;
hwnd=::FindWindow(NULL, "test"); //test是测试的对话框程序名
  //hwnd=::FindWindow(NULL, "迅雷5");  
while(!hwnd)
hwnd=::FindWindow(NULL, "test");  
  HWND listview=::FindWindowEx(hwnd, NULL, "SysListView32", NULL); //SysListView32是CListCtrl控件类名
   


  int count=(int)::SendMessage(listview, LVM_GETITEMCOUNT, 0, 0); 
  int i;  
   
  LVITEM lvi, *_lvi;  
  char item[512], subitem[512];  
  char *_item, *_subitem;  
  unsigned long pid;  
  HANDLE process;  
   
  GetWindowThreadProcessId(listview, &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);  
   
  lvi.cchTextMax=512;  
   
  for(i=0; i<count; i++) {  
int index=0;
lvi.iSubItem=0;  
lvi.pszText=_item;  
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);  
::SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);  

lvi.iSubItem=++index;  
lvi.pszText=_subitem;  
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);  
::SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);  

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

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

while(strlen(subitem)!=0)
{
lvi.iSubItem=1;  
lvi.pszText=_item;  
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);  
::SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);  

lvi.iSubItem=++index;  
lvi.pszText=_subitem;  
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);  
::SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);  

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

 
  }  
   
  VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);  
  VirtualFreeEx(process, _item, 0, MEM_RELEASE);  
  VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);



[解决办法]
ListView可能不是迅雷的直接子控件

热点排行