跨进程读取ListView(CListCtrl)内容
///
//Author: aaashun
//Date: 23/2/2009
//Email: aaashun@gmail.com
///
测试环境:VC2005,xp
欢迎批评指正.
最近在做一个很xxx的项目,需要把以前一个窗体里的一个ListView的所有内容抓下来然后存在本地的数据库里.
由于涉及到一些底层的知识.于是研究了一下,并在前人的基础上加以改进.废话不多说了.
首先需要用到Spy++来查看目标窗体信息
大家看到了吧,主窗体Caption是"ListDemo"
接下来是一个ListView class是"SysListView32"
还有一个ListHeader class是"SysHeader32"
好了,接下来开始编码
- //窗口句柄
- HWND hwnd=NULL;
- //目标进程ID与句柄
- DWORD PID;
- HANDLE hProcess;
- int nColumnCount=0; //列数
- int nRowCount=0; //行数
- int nColumnIndex=0; //列索引
- int nRowIndex=0; //行索引
- int nBufferLength=1024; //缓冲区大小
- LVITEM lvitem;
- wchar_t *buffer =new wchar_t[nBufferLength]; //UNICODE
- wmemset(buffer,0,nBufferLength);
- //远程虚拟空间地址
- LVITEM *pVirtualItem;
- wchar_t *pVirtualBuffer;
- hwnd=::FindWindow(NULL,_T("ListDemo"));
- if(hwnd)
- {
- hwnd=::FindWindowEx(hwnd,NULL,_T("SysListView32"),NULL);
- }
- if(!hwnd)
- {
- AfxMessageBox(L"目标程序没有打开!");
- return;
- }
- GetWindowThreadProcessId(hwnd,&PID);
- hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID); //获取目标进程句柄失败
- if(!hProcess)
- return;
- HWND hLVHeader=(HWND)::SendMessage(hwnd,LVM_GETHEADER,0,0); //获取ListView列头句柄
- nColumnCount=(int)::SendMessage(hLVHeader,HDM_GETITEMCOUNT,0,0); //获取ListView行数
- nRowCount =(int)::SendMessage(hwnd,LVM_GETITEMCOUNT,0,0); //获取ListView列数
- //在目标进程地址空间分配内存
- pVirtualItem =(LVITEM *)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM) , MEM_COMMIT, PAGE_READWRITE);
- pVirtualBuffer=(wchar_t *)VirtualAllocEx(hProcess, NULL, nBufferLength*2, MEM_COMMIT, PAGE_READWRITE);
- if ((!pVirtualItem)||(!pVirtualBuffer))
- {
- MessageBox(L"内存分配失败!");
- return;
- }
- CFile file;
- file.Open(L"listdata.txt",CFile::modeCreate|CFile::modeReadWrite);
- for(int i=0;i<nRowCount;i++)
- {
- for(int j=0;j<nColumnCount;j++)
- {
- nColumnIndex=i;
- nRowIndex=j;
- lvitem.cchTextMax=nBufferLength*2;
- lvitem.iSubItem=nRowIndex;
- lvitem.pszText=pVirtualBuffer;
- //核心技术:将LVITEM结构体插入目标进程里,然后通过LVM_GETITEMTEXT消息获取指定项的文本
- WriteProcessMemory(hProcess, pVirtualItem, &lvitem, sizeof(LVITEM), NULL);
- ::SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)nColumnIndex, (LPARAM)pVirtualItem);
- ReadProcessMemory(hProcess, pVirtualBuffer, buffer, nBufferLength*2,NULL);
- //转换成ANSI编码
- char *ansiBuffer=ShunW2A(buffer);
- file.Write(ansiBuffer,(UINT)strlen(ansiBuffer));
- file.Write("/t",1);
- delete []ansiBuffer;
- }
- file.Write("/r/n",2);
- }
- file.Close();
- //释放目标进程里分配的内存
- VirtualFreeEx(hProcess,pVirtualItem ,sizeof(LVITEM) ,MEM_RELEASE);
- VirtualFreeEx(hProcess,pVirtualBuffer,nBufferLength*2,MEM_RELEASE);
- CloseHandle(hProcess);
- delete []buffer;
这里还用到了UNICODE 转 ANSI的一个函数 LPSTR ShunW2A(LPCWSTR lpcwszStrIn),是在函数内部自动分配空间的,所以需要在使用后释放一下
- LPSTR ShunW2A(LPCWSTR lpcwszStrIn)
- {
- LPSTR pszOut = NULL;
- if (lpcwszStrIn != NULL)
- {
- int nInputStrLen = (int)wcslen (lpcwszStrIn);
- //获得缓冲所需的字节数大小
- int nOutputStrLen = WideCharToMultiByte(CP_ACP, 0, lpcwszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2;
- pszOut = new char [nOutputStrLen];
- if (pszOut)
- {
- memset (pszOut,0,nOutputStrLen);
- WideCharToMultiByte(CP_ACP, 0, lpcwszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);
- }
- }
- return pszOut;
- }
OK,结束了
跨进程读取ListView(CListCtrl)内容相关推荐
- linux 跨进程读取内存,Android之Linux跨进程通信的方式
As we all know,Android是基于Linux内核开发的,而市面上几乎所有的App都离开跨进程通信.可能你会说Android是通过Binder完成进程之间的通信的.但是Binder是怎么 ...
- android listview 滑动黑屏,Android 跨进程启动Activity黑屏(白屏)的三种解决方案
当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?).当然从桌面Lunacher启动一个App时也会出现相同情况,那是因为App冷启动也属于跨进程启动Activi ...
- VirtualAllocEx 跨进程读写数据 代码注入
VirtualAllocEx 函数的作用是在指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0. LPVOID VirtualAllocEx( HANDLE ...
- Android中的跨进程通信方法实例及特点分析(二):ContentProvider
1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content P ...
- Android的跨进程通信
Android系统的跨进程简介 为什么不能直接跨进程通信? 为了安全考虑,应用之间的内存是无法互相访问的,各自的数据都存在于自身的内存区域内. 如何跨进程通信? 要想跨进程通信,就要找到一个大家都能访 ...
- android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例
一.概述 前面一篇文章Android通过AIDL实现跨进程更新UI我们学习了aidl跨进程更新ui,这种传统方式实现跨进程更新UI是可行的,但有以下弊端: View中的方法数比较多,在IPC中需要增加 ...
- 进程线程007 进程挂靠与跨进程读写内存
文章目录 进程挂靠 进程与线程的关系 线程与进程如何关联 为什么需要ApcState.Process CR3的值可以随便改吗 分析NtReadVirtualMemory函数 总结 跨进程读写内存 跨进 ...
- Android 跨进程通信大总结
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/111553746 本文出自[赵彦军的博客] 文章目录 1.Android进程 2.修 ...
- 微信小游戏直播在Android端的跨进程渲染推流实践
本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...
最新文章
- RedHat5下scrumworks pro 5.0安装详细说明
- Hibernate调用存储过程
- linux修改时间指令,Linux 修改时间的指令
- ruby hash方法_Ruby中带有示例的Hash.default(key = nil)方法
- hdu 2014鞍山赛区 5073 Galaxy
- jsp java循环读取json_JAVA JSON遍历问题,求解(内附代码)
- cmake make
- RocketMQ(七)——消息的消费
- PHP技术的优缺点(转载)
- 计算机网络基础 — Bypass 网卡
- 黄杏元《地理信息系统概论》考研复习考点精讲(八)
- HearthBuddy 召唤随从的问题
- 电脑重装系统后U6连不上服务器了,重装系统后电脑怎么连不上网络?电脑连接网络步骤...
- 物联网控制卡学习资料第465篇:基于STM32F429多路RS232 物联网控制卡
- 有n个人围成一圈,从第1个人开始,1、2、3报数,报至3出局,余下的人继续从1、2、3报数,问:最后剩下的一人是原来的第几号?同时求出被淘汰编号的序列。(要求:用循环队列解决该问题。)
- java中getchars是什么意思_java中的getChars()方法
- 48张帮助程序员梳理知识框架结构图谱
- 2007全球杀毒软件排名 + 2007全球防火墙排名
- 2021-06-16 节点电压为极坐标下的牛顿-拉夫逊法潮流计算学习
- 2023年5月电信高性价比流量卡推荐 不限速、费用低、流量多!