ListCount = SendMessage(hwnd, LVM_GETITEMCOUNT, 0, 0)
ItemText=SendMessage(hlist, LVM_GETITEMTEXT, 0,0)
ListCount能正常獲取行數,但是獲取ItemText就出錯
uj5u.com熱心網友回復:
獲取資料沒這么簡單!
需要與另外幾個API協同操作,才能完成的。
參考這個:
讀取其他軟體listview控制元件的內容
uj5u.com熱心網友回復:
僅供參考,盡管不是VB6://---------------------------------------------------------------------------
// 讀取ListView中的Item
// hWindow為目標ListView的句柄
// strlist用來存放ListView的Item字串
// 來自http://www.ccrun.com
// by ccrun(老妖)
//---------------------------------------------------------------------------
void MyGetListViewItem(HWND hWindow,TStrings *strlist)
{
const nMaxLen=1023;
char szBuf[nMaxLen+1];
char buf[nMaxLen+1];
int nLVItemCount;
int nColumns;
DWORD dwProcessID;
HANDLE hProcess;
HANDLE hHeaderCtrl;
LVITEM lvItemLocal;
HDITEM hdItemLocal;
DWORD dwBytesRead, dwBytesWrite;
bool bSuccess,bWriteOK;
//注意:本文來自www.ccrun.com,by ccrun(老妖),轉載請注明出處。
//本文轉自 C++Builder研究 - http://www.ccrun.com/article.asp?i=583&d=eahk4z
//為防止某些不負責任的轉載者,故出此下策,在代碼中加入宣告,請大家原諒。
GetWindowThreadProcessId(hWindow,&dwProcessID);
hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
if(!hProcess) //得不到指定行程的句柄
return;
//在指定行程內分配存盤空間
LPVOID lpTextRemote=VirtualAllocEx(hProcess,NULL,nMaxLen+1,MEM_COMMIT,PAGE_READWRITE);
LPVOID lpListItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
LPVOID lpHeadItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(HDITEM),MEM_COMMIT,PAGE_READWRITE);
if((!lpTextRemote) || (!lpListItemRemote) || (!lpHeadItemRemote)) //不能在指定行程內分配存盤空間
return;
nLVItemCount=ListView_GetItemCount(hWindow);
hHeaderCtrl=ListView_GetHeader(hWindow);
nColumns=Header_GetItemCount(hHeaderCtrl);
if (nColumns<=0) {
nColumns=1;
} else {
buf[0]=0;
for (int j=0;j<nColumns;j++) {
ZeroMemory(szBuf,nMaxLen+1);
bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //寫記憶體錯誤
return;
hdItemLocal.mask=HDI_TEXT;
hdItemLocal.cchTextMax=nMaxLen;
hdItemLocal.pszText=(LPTSTR)lpTextRemote;
dwBytesWrite=0;
bWriteOK=WriteProcessMemory(hProcess,lpHeadItemRemote,(LPVOID)&hdItemLocal,sizeof(HDITEM),(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //寫記憶體錯誤
return;
SendMessage(hHeaderCtrl,HDM_GETITEM,(WPARAM)j,(LPARAM)lpHeadItemRemote);
bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);
//從指定行程存盤空間讀取文本
if(!bSuccess) //不能在指定行程內讀取文本
return;
if (j>0) strcat(buf,"|");
strcat(buf,AnsiString(szBuf).c_str());
}
strlist->Add(buf);
}
// strlist->Add("ListView的Columns數: " + String(nColumns));
// strlist->Add("---------------------------");
for (int i=0;i<nLVItemCount;i++) {
buf[0]=0;
for (int j=0;j<nColumns;j++) {
ZeroMemory(szBuf,nMaxLen+1);
bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //寫記憶體錯誤
return;
lvItemLocal.iItem=i;
lvItemLocal.iSubItem=j;
lvItemLocal.mask=LVIF_TEXT;
lvItemLocal.cchTextMax=nMaxLen;
lvItemLocal.pszText=(LPTSTR)lpTextRemote;
dwBytesWrite=0;
bWriteOK=WriteProcessMemory(hProcess,lpListItemRemote,(LPVOID)&lvItemLocal,sizeof(LVITEM),(LPDWORD)&dwBytesWrite);
if(!bWriteOK) //寫記憶體錯誤
return;
SendMessage(hWindow,LVM_GETITEMTEXT,(WPARAM)i,(LPARAM)lpListItemRemote);
bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);
//從指定行程存盤空間讀取文本
if(!bSuccess) //不能在指定行程內讀取文本
return;
if (j>0) strcat(buf,"|");
strcat(buf,AnsiString(szBuf).c_str());
}
strlist->Add(buf);
}//end of for(i)
//在指定行程內釋放存盤空間
VirtualFreeEx(hProcess,lpHeadItemRemote,0,MEM_RELEASE);
VirtualFreeEx(hProcess,lpListItemRemote,0,MEM_RELEASE);
VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);
//關閉指定行程句柄
CloseHandle(hProcess);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/55842.html
標籤:控件
