SysListView32的句柄有讀到,行數和列數都查過有,但是讀不到內容,有可能是什么原因導致的?
我是WIN7 64位系統,程式都是32位
// 查找視窗句柄
HWND hWnd;
hWnd=::FindWindow(NULL,_T("Windows 任務管理器"));
hWnd=::FindWindowEx(hWnd,0,"#32770",0);
hListview=::FindWindowEx(hWnd,0,_T("SysListView32"),NULL);
//行程界面視窗的句柄,通過SPY獲取
// hListview = m_TradeCtrls.hStockList;
//listview的列頭句柄
headerhwnd = ::SendMessage(hListview, LVM_GETHEADER, 0, 0);
//總行數:行程的數量
rows = ::SendMessage(hListview,LVM_GETITEMCOUNT,0,0);
//串列列數
cols = ::SendMessage((HWND)headerhwnd, HDM_GETITEMCOUNT,0,0);
//cols = Header_GetItemCount(ListView_GetHeader(hListview));
ThreadID = GetWindowThreadProcessId(hListview,&ProcessID);
//打開并插入行程
//hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE,ProcessID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE,ProcessID);
//申請代碼的記憶體區
pointer = (LVITEM*)VirtualAllocEx(hProcess,NULL, sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE);
for (int i = 0; i < rows;i++ )
{
for (int j = 0; j < cols;j++ )
{
LVITEM vItem;
vItem.mask = LVIF_TEXT; //說明pszText是有效的
vItem.iItem = i; //行號
vItem.iSubItem = j; //列號
vItem.cchTextMax = 512; //所能存盤的最大的文本為256位元組
LPSTR pItem = NULL;
//申請記憶體空間
pItem = (LPSTR)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
vItem.pszText = pItem;
BOOL b = WriteProcessMemory( hProcess , pointer , &vItem , sizeof(LVITEM),NULL);
int nRet = ::SendMessage(hListview, LVM_GETITEM,(WPARAM)i,(LPARAM)pointer);
//::SendMessage(hListview, LVM_GETITEMTEXTA,(WPARAM)i,(LPARAM)pointer);
char ItemBuf[512];
memset(ItemBuf,0,512);
ReadProcessMemory(hProcess, (PVOID)pItem, ItemBuf, 512, NULL);
CString str;
str.Format(_T("%s"),ItemBuf);
if (!str.IsEmpty())
AfxMessageBox(str);
//釋放記憶體空間
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
}
}
//釋放記憶體空間
VirtualFreeEx(hProcess, pointer, 0, MEM_RELEASE);//在其它行程中釋放申請的虛擬記憶體空間,MEM_RELEASE方式很徹底,完全回收
CloseHandle(hProcess);//關閉打開的行程物件
uj5u.com熱心網友回復:
//
LPMYLVITEM CRemoteListCtrlDlg::RemoteLVGetItem(int index,HWND hLvWnd)
{//
m_hHdWnd=ListView_GetHeader(m_hLvWnd);
int nColumn=::SendMessage(m_hHdWnd,HDM_GETITEMCOUNT,0,0);
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(m_hLvWnd,&pid);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//
LPMYLVITEM pRemoteItem = (LPMYLVITEM)VirtualAllocEx(hProcess, NULL, nColumn*sizeof(MYLVITEM), MEM_COMMIT, PAGE_READWRITE);
if (!pRemoteItem)
{
::MessageBox(NULL, "無法分配記憶體!", "錯誤!", NULL);
CloseHandle(hProcess);
return 0;
}
// local
LPMYLVITEM pLocalItem=new MYLVITEM[nColumn];
memset(pLocalItem,0,nColumn*sizeof(MYLVITEM));
for(int i=0; i<nColumn; i++)
{
pLocalItem[i].oldItem.mask=LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;//
pLocalItem[i].oldItem.iItem=index;//
pLocalItem[i].oldItem.iSubItem=i; //
pLocalItem[i].oldItem.cchTextMax=80;
pLocalItem[i].oldItem.pszText=pRemoteItem[i].text;// not pLocalItem[i].text
if(!WriteProcessMemory(hProcess, &pRemoteItem[i], &pLocalItem[i], sizeof(MYLVITEM), NULL))
{
::MessageBox(NULL, "WriteProcessMemory!", "錯誤!", NULL);
CloseHandle(hProcess);
return 0;
}
ListView_GetItem(m_hLvWnd,&pRemoteItem[i]);
// ::SendMessage(m_hLvWnd, LVM_GETITEM, (WPARAM)i, (LPARAM)&pRemoteItem[i]);
if(!ReadProcessMemory(hProcess, &pRemoteItem[i], &pLocalItem[i], sizeof(MYLVITEM), NULL))
{
::MessageBox(NULL, "ReadProcessMemory!", "錯誤!", NULL);
CloseHandle(hProcess);
return 0;
}
// !!!
pLocalItem[i].oldItem.pszText=pLocalItem[i].text;
//
// afxDump << pLocalItem[i].oldItem.iImage << "=iImage\n";// 0 1 2 3
//
// HIMAGELIST hRemoteImageLst=ListView_GetImageList(m_hLvWnd, LVSIL_SMALL);
// HICON hicon=ImageList_ExtractIcon(0,hRemoteImageLst,pLocalItem[i].oldItem.iImage);
}
//釋放記憶體
CloseHandle(hProcess);
VirtualFreeEx(hProcess, pRemoteItem , 0, MEM_RELEASE);
return pLocalItem;
}
要在 另一個· 分配 記憶體·
uj5u.com熱心網友回復:
Windows 任務管理器 64位系統模式的這個程式是64位的, 如果啟動32位的任務管理器, 是可以的, 我試過轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/10473.html
標籤:界面
上一篇:影像等距坐標點的提取
下一篇:命名管道CMD怎么析構退出?
