如题,就是获取外部程序中的LISTVIEW中的内容,下面是我写的函数,结果是返回一大堆乱码,如"烫烫烫烫烫"
麻烦各位看看我的代码谢谢void GetItem(HWND hwnd)
{
int iItem = 0;
LVITEM lvitem,*plvitem;
char ItemBuf[512], *pItem;
DWORD PID;
HANDLE hProcess;

hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
plvitem = (LVITEM*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
pItem = (char*)VirtualAllocEx(hProcess,NULL,512,MEM_COMMIT,PAGE_READWRITE);
lvitem.cchTextMax = 512;
lvitem.iSubItem = 0;
lvitem.pszText = pItem;
WriteProcessMemory(hProcess,plvitem,&lvitem,sizeof(LVITEM),NULL);
::SendMessage(hwnd,LVM_GETITEMTEXT,(WPARAM)iItem,(LPARAM)plvitem);
ReadProcessMemory(hProcess,pItem,ItemBuf,512,NULL);
MessageBox(ItemBuf);
}

解决方案 »

  1.   

    hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
    PID没有初始化。
      

  2.   

    也试过,返回的是空值
    CString CTestDlg::GetItem(HWND hwnd)
    {
    CString str;
    DWORD processID = NULL;
    GetWindowThreadProcessId(hwnd,&processID);
    HANDLE process = ::OpenProcess(PROCESS_VM_OPERATION |PROCESS_VM_WRITE,FALSE,processID);
    PVOID buffer = VirtualAllocEx(process,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE); LVITEM item;
    WriteProcessMemory(process,buffer,&item,sizeof(LVITEM),NULL);
    ::SendMessage(hwnd,LVM_GETITEMTEXT,1,(LPARAM)buffer);
    ReadProcessMemory(process,buffer,&item,sizeof(LVITEM),NULL);
    str = item.pszText;
    VirtualFreeEx(process,buffer,sizeof(LVITEM),MEM_DECOMMIT);
    return str;
    }
      

  3.   

    bool GetLvItemText(HWND Lv, int Index, int SubItem, CString& Text)
    {
    const int bufferLength = 4000;
    bool result = false;
    DWORD processId = NULL;
    GetWindowThreadProcessId(Lv, &processId);
    if (processId == NULL) return false;
    HANDLE process = ::OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, FALSE, processId);
    if (process == NULL) return false;
    PVOID buffer = VirtualAllocEx(process, NULL, bufferLength, MEM_COMMIT, PAGE_READWRITE);
    if (buffer != NULL)
    {
    LPLVITEM item = (LPLVITEM)new BYTE[bufferLength];
    item->mask = LVIF_TEXT;
    item->iSubItem = SubItem;
    item->pszText = (LPTSTR)((PBYTE)buffer+sizeof(LVITEM));
    item->cchTextMax = (bufferLength - sizeof(LVITEM)) / sizeof(TCHAR);
    WriteProcessMemory(process, buffer, item, sizeof(LVITEM), NULL);
    if (SendMessage(Lv, LVM_GETITEMTEXT, Index, (LPARAM)buffer) != 0)
    {
    ReadProcessMemory(process, buffer, item, 1024, NULL);
    Text = (LPTSTR)((PBYTE)item+sizeof(LVITEM));
    result = true;
    }
    delete item;
    VirtualFreeEx(process, buffer, sizeof(LVITEM), MEM_DECOMMIT);
    }
    CloseHandle(process);
    return result;
    }
      

  4.   

    错了一点,更正:
    ReadProcessMemory(process, buffer, item, 1024, NULL);
    改为:
    ReadProcessMemory(process, buffer, item, bufferLength, NULL);
      

  5.   

    谢谢,真是高手~~~老是麻烦你,我刚学MFC,其实我不想一有问题就上来问的,不过实在是不懂,帮小弟指个路吧大哥,我应该怎么学才学得好呢?
      

  6.   

    遇到问题先自己分析、调试,这样会有助于自身提高,有时候可能要多花一些时间。如果项目比较急,就要问别人了。
    顺便提一下,你现在做的这个方面是Windows应用程序中比较深层的东西,没有人指导是很难实现的,所以你不会做也是很正常的。(通常的问题我是不会给出完整代码的)