VC读写其他进程ListCtrl数据到本进程的实例,下面用Windows任务管理器来做测试:
1、捕获窗口句柄:
用SPY++可以看到如下父子窗口关系:
添加ListCtrl,设置style / Report、关联控件变量m_ListCtrl,再添加一个按钮,如下图:
2、相关代码:
- BOOL CTestDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- ......
- // TODO: Add extra initialization here
- // 设置ListCtrl窗口样式
- LONG lStyle = m_ListCtrl.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
- lStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
- m_ListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,(LPARAM)lStyle);
- // 添加上面的列表头
- m_ListCtrl.InsertColumn(0,"映像名称",NULL,100, -1);
- m_ListCtrl.InsertColumn(1,"PID",NULL,60,-1);
- m_ListCtrl.InsertColumn(2,"用户名",NULL,120,-1);
- m_ListCtrl.InsertColumn(3,"CPU",NULL,60,-1);
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CTestDlg::OnBtnRead()
- {
- // TODO: Add your control notification handler code here
- m_ListCtrl.DeleteAllItems();
- // 查找窗口句柄
- HWND hWnd,hListview;
- hWnd=::FindWindow(NULL,_T("Windows 任务管理器"));
- hWnd=::FindWindowEx(hWnd,0,"#32770",0);
- hListview=::FindWindowEx(hWnd,0,_T("SysListView32"),NULL);
- if(!hListview)
- {
- MessageBox("Listview handle is NULL !");
- return;
- }
- int count = (int)::SendMessage(hListview,LVM_GETITEMCOUNT,0,0);
- int i,nItem;
- // 获取ListView行数
- CString strTemp;
- strTemp.Format("总共%d行记录",count);
- MessageBox(strTemp);
- CString str1="";
- CString str2="";
- CString str3="";
- CString str4="";
- DWORD pid;
- HANDLE process;
- LVITEM lvi, *_lvi;
- char firstitem[512], secitem[512],thirditem[512],fourthitem[512];
- char *_firstitem, *_secitem,*_thirditem,*_fourthitem;
- memset(firstitem,0,512);
- memset(secitem,0,512);
- memset(thirditem,0,512);
- memset(fourthitem,0,512);
- // 获取窗口PID、打开进程
- GetWindowThreadProcessId(hListview, &pid);
- process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
- PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);
- // 申请内存空间
- _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE);
- _firstitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE);
- _secitem =(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE);
- _thirditem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE);
- _fourthitem=(char*)VirtualAllocEx(process,NULL, 512, MEM_COMMIT,PAGE_READWRITE);
- lvi.cchTextMax=512;
- // 这里应该递减、保持与任务管理器一样顺序
- for(i=count; i>=0; i--)
- {
- // 获取第一列记录
- lvi.iSubItem=0;
- lvi.pszText=_firstitem;
- WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
- ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
- // 获取第二列记录
- lvi.iSubItem=1;
- lvi.pszText=_secitem;
- WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
- ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
- // 获取第三列记录
- lvi.iSubItem=2;
- lvi.pszText=_thirditem;
- WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
- ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
- // 获取第四列记录
- lvi.iSubItem=3;
- lvi.pszText=_fourthitem;
- WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
- ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
- // 读取进程内存
- ReadProcessMemory(process, _firstitem, firstitem, 512, NULL);
- ReadProcessMemory(process, _secitem, secitem, 512, NULL);
- ReadProcessMemory(process, _thirditem, thirditem, 512, NULL);
- ReadProcessMemory(process, _fourthitem, fourthitem, 512, NULL);
- // 格式化字符串
- str1.Format("%s",firstitem);
- str2.Format("%s",secitem);
- str3.Format("%s",thirditem);
- str4.Format("%s",fourthitem);
- // 增加到列表
- nItem = m_ListCtrl.InsertItem(0,str1);
- m_ListCtrl.SetItem(nItem,1,1,str2,NULL,0,0,0);
- m_ListCtrl.SetItem(nItem,2,1,str3,NULL,0,0,0);
- m_ListCtrl.SetItem(nItem,3,1,str4,NULL,0,0,0);
- }
- // 释放内存空间
- VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
- VirtualFreeEx(process, _firstitem, 0, MEM_RELEASE);
- VirtualFreeEx(process, _secitem, 0, MEM_RELEASE);
- VirtualFreeEx(process, _thirditem, 0, MEM_RELEASE);
- VirtualFreeEx(process, _fourthitem, 0, MEM_RELEASE);
- }
读取文件列表:
- void CTestDlg::OnBtnReadFile()
- {
- // TODO: Add your control notification handler code here
- m_ListCtrl.DeleteAllItems();
- int nRow;
- int j;
- nRow = m_ListCtrl.GetHeaderCtrl()->GetItemCount();
- for(j=0;j
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录