我用 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也有自己实现的版本。