hechuan2646 2013-06-11 03:30 采纳率: 0%
浏览 1622

关于MFC读取外部程序的ListControl内容

MFC程序读取其他应用程序的Listcontrol内容时,只能读取到目标软件Listcontrol的部分列内容。但是读取任务管理器时,是正常的,我也尝试过读取一些其他软件,都是正常的。代码是我在网上查的比较经典的一种方法。代码如下:

DWORD pid;
HANDLE process;
LVITEM lvi, *_lvi;
char firstItem[512], secondItem[512], thirdItem[512], fourthItem[512], fifthItem[512], sixthItem[512], seventhItem[512], eighthItem[512], ninthItem[512];
char *_firstItem, *_secondItem, *_thirdItem, *_fourthItem, *_fifthItem, *_sixthItem, *_seventhItem, *_eighthItem, *_ninthItem;

memset(firstItem, 0, 512);
memset(secondItem, 0, 512);
memset(thirdItem, 0, 512);
memset(fourthItem, 0, 512);
memset(fifthItem, 0, 512);
memset(sixthItem, 0, 512);
memset(seventhItem, 0, 512);
memset(eighthItem, 0, 512);
memset(ninthItem, 0, 512);

// 获取窗口PID、打开进程
GetWindowThreadProcessId(hWnd, &pid);
process = OpenProcess( PROCESS_ALL_ACCESS, TRUE, pid);

if(!process)
return FALSE;

// 申请内存空间
_lvi = (LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
_firstItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);

_secondItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);

_thirdItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);

_fourthItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);

_fifthItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);

_sixthItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);
_seventhItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);
_eighthItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);
_ninthItem = (char*)VirtualAllocEx(process, NULL, 512 + 1, MEM_COMMIT,PAGE_READWRITE);

lvi.cchTextMax = 512;
CString strTemp1;
for(i=0; i<count; i++)
{

// 获取第一列记录
lvi.iSubItem = 0;
lvi.pszText = _firstItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 获取第二列记录
lvi.iSubItem = 1;
lvi.pszText = _secondItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 获取第三列记录
lvi.iSubItem = 2;
lvi.pszText = _thirdItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 获取第四列记录
lvi.iSubItem = 3;
lvi.pszText = _fourthItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 获取第五列记录
lvi.iSubItem = 4;
lvi.pszText = _fifthItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 获取第六列记录
lvi.iSubItem = 5;
lvi.pszText = _sixthItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 获取第7列记录
lvi.iSubItem = 6;
lvi.pszText = _seventhItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 获取第8列记录
lvi.iSubItem = 7;
lvi.pszText = _eighthItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 获取第9列记录
lvi.iSubItem = 8;
lvi.pszText = _ninthItem;
WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

// 读取进程内存

ReadProcessMemory(process, _firstItem, firstItem, 512, NULL);
ReadProcessMemory(process, _secondItem, secondItem, 512, NULL);
ReadProcessMemory(process, _thirdItem, thirdItem, 512, NULL);
ReadProcessMemory(process, _fourthItem, fourthItem, 512, NULL);
ReadProcessMemory(process, _fifthItem, fifthItem, 512, NULL);
ReadProcessMemory(process, _sixthItem, sixthItem, 512, NULL);
ReadProcessMemory(process, _seventhItem, seventhItem, 512, NULL);
ReadProcessMemory(process, _eighthItem, eighthItem, 512, NULL);
ReadProcessMemory(process, _ninthItem, ninthItem, 512, NULL);

    // 格式化字符串   

str1.Format("%s, %s, %s, %s, %s, %s, %s, %s, %s.",firstItem, secondItem, thirdItem, fourthItem, fifthItem, sixthItem, seventhItem, eighthItem, ninthItem);
AfxMessageBox(str1);

}

// 释放内存空间

VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);

VirtualFreeEx(process, _firstItem, 0, MEM_RELEASE);

VirtualFreeEx(process, _secondItem, 0, MEM_RELEASE);

VirtualFreeEx(process, _thirdItem, 0, MEM_RELEASE);

VirtualFreeEx(process, _fourthItem, 0, MEM_RELEASE);

VirtualFreeEx(process, _fifthItem, 0, MEM_RELEASE);
VirtualFreeEx(process, _sixthItem, 0, MEM_RELEASE);
VirtualFreeEx(process, _seventhItem, 0, MEM_RELEASE);
VirtualFreeEx(process, _eighthItem, 0, MEM_RELEASE);
VirtualFreeEx(process, _ninthItem, 0, MEM_RELEASE);

贴图是我读取windows任务管理器的结果(正常)和目标程序的结果(只能读取到一列)

求高手知道,交流。也可以加我QQ进行交流指导。QQ:315482682

图片贴不上来,可到空间去看,谢谢啦

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 18:58
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算