....
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中数据没有.
???
所有的分全部奉送了!
谢谢大虾!
---------------------------------
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);