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

原创 2013年12月04日 14:14:56

如果需要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

vc 实现打印功能

Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这...

VC获取其他进程ListCtrl内容

VC读写其他进程ListCtrl数据到本进程的实例,下面用Windows任务管理器来做测试: 1、捕获窗口句柄:     用SPY++可以看到如下父子窗口关系:          添加ListCtrl...

VC获取系统进程列表、查找进程、关闭进程

PROCESSENTRY32 pe32;     pe32.dwSize=sizeof(pe32);     HANDLE hProcessSnap=::CreateToolhelp32Snaps...

listbox消息大全(C语言也能干大事)

在看一程序是发现listbox的消息常量不懂,所以就找到了下面的资料。现贴出来和大家分享分享列表框主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示.列表框具有边框,并...

C#SendMessage用法

函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是应用程序和应用程序之间进行消息传递的主要手段之一。     函数原型:LRES...
  • dangdaa
  • dangdaa
  • 2011年11月26日 23:52
  • 5282

使用消息实现进程间通信

1.问题阐述 消息是Windows提供的一种驱动机制,在前面的章节中,已经多次使用消息解决问题了。使用消息进行进程通信的过程,就是使用消息激活某种操作的过程。对于进程间的通信,一般采用用户自定义的消...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

VC获取其他软件控件的内容

// GetWindowData.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "GetWindowData.h" #ifdef _DE...

C#如何获取其他程序ListView控件中的内容 含源码

需求:获取其他程序中的ListView控件的文本内容 原理:进程之间是相互隔离的,数据是不能共享的(有些特例)    LVM_GETTITEMTEXT:将一个数据缓冲区提供给listview32控件,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【VC版】如何获取其他进程中ListView控件中的内容
举报原因:
原因补充:

(最多只允许输入30个字)