您的位置:首页 > 其它

获取其他进程Listctrl的数据

2011-09-02 01:44 281 查看
//
// http://www.codeproject.com/KB/threads/int64_memsteal.aspx //
HANDLE InjectProcess(HWND listview)
{
unsigned long pid;
HANDLE process;

GetWindowThreadProcessId(listview, &pid);

process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);

return process;

}

void* MallocInPocess(HANDLE process, size_t size, void *def_val=NULL)
{
void* p = VirtualAllocEx(process, NULL, size,
MEM_COMMIT, PAGE_READWRITE);

if(def_val)
VERIFY(WriteProcessMemory(process, p, def_val, size, NULL));

return p;
}

void FreeInPocess(HANDLE process, void* _lvi)
{
VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
}

CString CListCtrl_GetItemText(HWND m_hWnd, HANDLE hProcess, int nItem, int nSubItem)
{
ASSERT(::IsWindow(m_hWnd));

CString s;

//
// lvi
//
LVITEM lvi;
memset(&lvi, 0, sizeof(LVITEM));
lvi.iSubItem = nSubItem;

const int nLen = 1280;

int nRes;
lvi.cchTextMax = nLen;

//memory
TCHAR *str = (TCHAR*)MallocInPocess(hProcess, nLen*sizeof(TCHAR));
if(!str)
return s;

lvi.pszText = str;

LVITEM *plvi = (LVITEM*)MallocInPocess(hProcess, sizeof(LVITEM), &lvi);
if(!plvi)
return s;

nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
(LPARAM)plvi);

TCHAR str2[nLen];

VERIFY(ReadProcessMemory(hProcess, str, str2, 512, NULL));

s = str2;

FreeInPocess(hProcess, plvi);
FreeInPocess(hProcess, str);

return s;
}

void Ctest2Dlg::OnBnClickedButton1()
{
HWND hMain = ::FindWindowEx(NULL,NULL,NULL,_T("test1"));
HWND hList = ::FindWindowEx(hMain, NULL , _T("SysListView32"), NULL);
ASSERT(hList);

CListCtrl List;
VERIFY(List.Attach(hList));
int nItem = List.GetItemCount();
int nCol = List.GetHeaderCtrl()->GetItemCount();

HANDLE hPoc = InjectProcess(hList);

for(int i=0; i<nItem; i++)
{
for(int j=0; j<nCol; j++)
{
CString szText = CListCtrl_GetItemText(hList,hPoc,i,j);
TRACE("%s\n", szText);
MessageBox(szText);
}
}

List.Detach();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: