关闭

【VC版】如何获取其他进程中ListView控件中的内容

1375人阅读 评论(1) 收藏 举报

如果需要C#版的,可以看下我之前写的:C#如何获取其他程序ListView控件中的内容

获取其他进程的数据需要使用到以下几个函数:

  • VirtualAllocEx()
  • VirtualFreeEx()
  • WriteProcessMemory()
  • ReadProcessMemory()

以获取任务管理器中的进程列表为例,运行结果如下:


关键代码

	HANDLE	hProcess;
	LVITEM	*pointer;
	HWND	hwnd,hListview;
	int headerhwnd; //listview控件的列头句柄
	int rows,cols;  //listview控件中的行列数
	DWORD ProcessID = NULL;
	DWORD ThreadID = NULL;

	hwnd = (HWND)::FindWindow(_T("#32770") , _T("Windows 任务管理器"));
	hwnd = (HWND)::FindWindowEx(hwnd, 0, _T("#32770") , NULL );
	//进程界面窗口的句柄,通过SPY获取
	hListview = (HWND)::FindWindowEx(hwnd, 0, _T("SysListView32") , NULL );

	//listview的列头句柄
	headerhwnd = ::SendMessage(hListview, LVM_GETHEADER, 0, 0);

	//总行数:进程的数量
	rows = ::SendMessage(hListview,LVM_GETITEMCOUNT,0,0);
	//列表列数
	cols = ::SendMessage(hListview, HDM_GETITEMCOUNT,0,0);
	
	ThreadID = GetWindowThreadProcessId(hListview,&ProcessID);

	//打开并插入进程
	hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE,ProcessID);
	//申请代码的内存区
	pointer = (LVITEM*)VirtualAllocEx(hProcess,NULL, sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE);

	for (int i = 0; i < rows;i++ )
	{
		m_ProcessList.InsertItem(i,_T(""));
		for (int j = 0; j < cols;j++ )
		{
			LVITEM vItem;
			vItem.mask = LVIF_TEXT;	//说明pszText是有效的
			vItem.iItem = i;		//行号
			vItem.iSubItem = j;		//列号
			vItem.cchTextMax = 512;	//所能存储的最大的文本为256字节
			LPWSTR pItem = NULL;
			//申请内存空间
			pItem = (LPWSTR)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
			vItem.pszText = pItem;

			WriteProcessMemory( hProcess , pointer , &vItem , sizeof(LVITEM),NULL);
			::SendMessage(hListview, LVM_GETITEMW,(WPARAM)i,(LPARAM)pointer);
			char ItemBuf[512];
			memset(ItemBuf,0,512);
			ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
			CString str;
			str.Format(_T("%s"),ItemBuf);			
			m_ProcessList.SetItemText(i,j,str);
			//释放内存空间
			VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
		}
	}
	//释放内存空间
	VirtualFreeEx(hProcess, pointer, 0, MEM_RELEASE);//在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收
	CloseHandle(hProcess);//关闭打开的进程对象

关于内存管理的相关文章:

虚拟内存管理的作用/好处

虚拟地址空间

在应用程序中使用虚拟内存

谈谈使用远程线程来注入DLL

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:82247次
    • 积分:1145
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:5篇
    • 译文:0篇
    • 评论:65条
    博客专栏
    C++

    文章:2篇

    阅读:4575
    文章分类
    最新评论