读书人

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

发布时间: 2012-01-24 23:11:54 作者: rapoo

获取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可能不是迅雷的直接子控件

读书人网 >VC/MFC

热点推荐