windows窗口listview内容 获取

我用 c++写了一个 程序 来获取 相关内容 试了下 资源管理器 是可以的 但其他的listview 行 和列是可以获取
但是里面的内容获取不到 用了下 彗星小助手的工具 发现 试可以用 以报表视图(listview)方式获取到内容
请问如何获取内容?

代码如下

#include
#include
#include

int main() {

HWND hwnd,headers;
char str[5120];

char space[10]=" ";
int iItem=0;

//LVITEM64 lvitem, *plvitem;
LVITEM lvitem, *plvitem;
char *pItem;
DWORD PID;
HANDLE hProcess;
int rows,cols,i,j;

hwnd=FindWindow("#32770","Windows 任务管理器");
hwnd=FindWindowEx(hwnd,0,"#32770",0);
hwnd=FindWindowEx(hwnd,0,"SysListView32",0);

// printf("%d",ListviewHwnd);

iItem=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_SELECTED);

printf("%d\n",iItem);

//itoa(iItem,temp,10);
//MessageBox(NULL,temp,"iItem",NULL);
GetWindowThreadProcessId(hwnd, &PID);

hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); //PROCESS_ALL_ACCESS

DWORD dword=GetLastError();

printf("%d",dword);

plvitem=(LVITEMA*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
pItem=(char*)VirtualAllocEx(hProcess, NULL,16, MEM_COMMIT, PAGE_READWRITE);
if(!plvitem) {
printf("无法分配内存");
return 0;
}

lvitem.mask=LVIF_TEXT;
lvitem.cchTextMax=512;
lvitem.pszText=pItem;

rows=::SendMessage(hwnd,LVM_GETITEMCOUNT,0,0);
cols=1;
DWORD dwStyle=GetWindowLong(hwnd,GWL_STYLE);
headers=(HWND)::SendMessage(hwnd,LVM_GETHEADER,0,0);
if(headers){
    cols=::SendMessage(headers,HDM_GETITEMCOUNT,0,0);
    if(cols<1) cols=1;
}


printf("rows:%d|cols%d\n",rows,cols);

//printf("sizeof(LVITEM):%d\n",sizeof(LVITEM));

//printf("hprocess:%d\n",hProcess);

for(i=0;i<rows;i++){
for(j=0;j<cols;j++){

lvitem.iItem=i;
lvitem.iSubItem=j;



WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM ), NULL);
::SendMessage(hwnd,LVM_GETITEM, i, (LPARAM)plvitem); //LVM_GETITEMRECT LVM_GETITEMTEXT
 char ItemBuf[512];

// printf("sendMesage:%d "+a);

ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);

// MessageBox(NULL,ItemBuf,"ItemBuf",NULL);

// strcat(str,ItemBuf);
// strcat(str,space);

printf("%s",ItemBuf);

    printf(" ");


}
printf("\n");

}

//释放内存
CloseHandle(hwnd);
CloseHandle(hProcess);
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);

//printf("%s",str);

//printf("%d\n",strlen(str));

//memcpy(buf, str, strlen(str));
return 0 ;
}

不是所有的listview都能获取到。比如说vb6.0带的listview是vb自己实现的,没有用windows的comctl32.dll的实现,那么你用api就实现不了了。类似的。delphi的listview也有自己实现的版本。