....
char bf[40000];
memset(bf,0,40000);
int t;
LVITEM lvi;
memset(&lvi,0,sizeof(lvi));
lvi.mask=LVIF_TEXT;
lvi.iItem=1;
lvi.iSubItem=0;
lvi.cchTextMax =40000;
lvi.pszText=(LPSTR)&bf;
//lvi.state=LVIS_FOCUSED;
BOOL m_b = ::SendMessage(listHwnd,LVM_GETITEM,0,(LPARAM) (LPLVITEM)(&lvi));
....
m_b返回值为真。
通过spy++,发现message正确返回,窗口handle没有问题。
可就是bf中数据没有.
???
所有的分全部奉送了!
谢谢大虾!

解决方案 »

  1.   

    这个问题以前有人问过
    ---------------------------------
    first :获得listview的handle
    second:send message:LVM_GETITEMTEXT to it!
    关键是内存的申请问题
    因为是跨进程,否则pitem.pszText的存取会出错
    VirtualFreeEx()
    VirtualAllocEx()
    上面两个函数配合使用就ok了
    ------------------------先获得目标窗口的的进程hProcess....LPVOID lpTextRemote=VirtualAllocEx(hProcess,NULL,50,
                                  MEM_COMMIT,PAGE_READWRITE);
          LPVOID lpItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),
                                  MEM_COMMIT,PAGE_READWRITE);
          if((!lpTextRemote)|| (!lpItemRemote))
          {
        MessageBox("不能在指定进程内分配存储空间.");
        return;
        }
          lvItemLocal.iItem=0;
          lvItemLocal.iSubItem=2;
          lvItemLocal.mask=LVIF_TEXT;
          lvItemLocal.cchTextMax=49;
          lvItemLocal.pszText=(LPTSTR)lpTextRemote;
          unsigned int num=0;
          bool bWriteOK=WriteProcessMemory(hProcess,lpItemRemote,(LPVOID)&lvItemLocal,
             sizeof(LVITEM),(LPDWORD)&num);
          if(!bWriteOK)
          {
             MessageBox("Write error!");
             return;
          }
          else
             ShowMessage(AnsiString(num)+"Bytes wrote!");
          SendMessage(hWndLV,LVM_GETITEMTEXT,(WPARAM)1,(LPARAM)lpItemRemote);       //从指定进程存储空间读取文本
          CHAR szText[50];
        DWORD dwBytesRead;
       bSucceed=ReadProcessMemory(hProcess,lpTextRemote,szText,50,&dwBytesRead);
        if(!bSucceed)
       {
        MessageBox("不能在指定进程内读取文本.");
        return;
        }
          //处理
        ShowMessage(szText);
        //在指定进程内释放存储空间
          bSucceed=VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);
          if(!bSucceed)
          {
             MessageBox("不能在指定进程内释放存储空间.");
             return;
        }
          bSucceed=VirtualFreeEx(hProcess,lpItemRemote,0,MEM_RELEASE);
          if(!bSucceed)
          {
             MessageBox("不能在指定进程内释放存储空间.");
             return;
        }
          //关闭指定进程句柄
          CloseHandle(hProcess);