VC读写其他进程ListCtrl数据到本进程的实例,下面用Windows任务管理器来做测试:

1、捕获窗口句柄:

用SPY++可以看到如下父子窗口关系:

添加ListCtrl,设置style / Report、关联控件变量m_ListCtrl,再添加一个按钮,如下图:

2、相关代码:

view plaincopy to clipboardprint?
  1. BOOL CTestDlg::OnInitDialog()
  2. {
  3. CDialog::OnInitDialog();
  4. ......
  5. // TODO: Add extra initialization here
  6. // 设置ListCtrl窗口样式
  7. LONG lStyle = m_ListCtrl.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
  8. lStyle |=  LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
  9. m_ListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,(LPARAM)lStyle);
  10. // 添加上面的列表头
  11. m_ListCtrl.InsertColumn(0,"映像名称",NULL,100, -1);
  12. m_ListCtrl.InsertColumn(1,"PID",NULL,60,-1);
  13. m_ListCtrl.InsertColumn(2,"用户名",NULL,120,-1);
  14. m_ListCtrl.InsertColumn(3,"CPU",NULL,60,-1);
  15. return TRUE;  // return TRUE  unless you set the focus to a control
  16. }
view plaincopy to clipboardprint?
  1. void CTestDlg::OnBtnRead()
  2. {
  3. // TODO: Add your control notification handler code here
  4. m_ListCtrl.DeleteAllItems();
  5. // 查找窗口句柄
  6. HWND    hWnd,hListview;
  7. hWnd=::FindWindow(NULL,_T("Windows 任务管理器"));
  8. hWnd=::FindWindowEx(hWnd,0,"#32770",0);
  9. hListview=::FindWindowEx(hWnd,0,_T("SysListView32"),NULL);
  10. if(!hListview)
  11. {
  12. MessageBox("Listview handle is NULL !");
  13. return;
  14. }
  15. int count = (int)::SendMessage(hListview,LVM_GETITEMCOUNT,0,0);
  16. int i,nItem;
  17. // 获取ListView行数
  18. CString strTemp;
  19. strTemp.Format("总共%d行记录",count);
  20. MessageBox(strTemp);
  21. CString str1="";
  22. CString str2="";
  23. CString str3="";
  24. CString str4="";
  25. DWORD   pid;
  26. HANDLE  process;
  27. LVITEM  lvi, *_lvi;
  28. char    firstitem[512], secitem[512],thirditem[512],fourthitem[512];
  29. char    *_firstitem, *_secitem,*_thirditem,*_fourthitem;
  30. memset(firstitem,0,512);
  31. memset(secitem,0,512);
  32. memset(thirditem,0,512);
  33. memset(fourthitem,0,512);
  34. // 获取窗口PID、打开进程
  35. GetWindowThreadProcessId(hListview, &pid);
  36. process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
  37. PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);
  38. // 申请内存空间
  39. _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE);
  40. _firstitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE);
  41. _secitem  =(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE);
  42. _thirditem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE);
  43. _fourthitem=(char*)VirtualAllocEx(process,NULL, 512, MEM_COMMIT,PAGE_READWRITE);
  44. lvi.cchTextMax=512;
  45. // 这里应该递减、保持与任务管理器一样顺序
  46. for(i=count; i>=0; i--)
  47. {
  48. // 获取第一列记录
  49. lvi.iSubItem=0;
  50. lvi.pszText=_firstitem;
  51. WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  52. ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
  53. // 获取第二列记录
  54. lvi.iSubItem=1;
  55. lvi.pszText=_secitem;
  56. WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  57. ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
  58. // 获取第三列记录
  59. lvi.iSubItem=2;
  60. lvi.pszText=_thirditem;
  61. WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  62. ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
  63. // 获取第四列记录
  64. lvi.iSubItem=3;
  65. lvi.pszText=_fourthitem;
  66. WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  67. ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
  68. // 读取进程内存
  69. ReadProcessMemory(process, _firstitem,  firstitem,  512, NULL);
  70. ReadProcessMemory(process, _secitem,    secitem,    512, NULL);
  71. ReadProcessMemory(process, _thirditem,  thirditem,  512, NULL);
  72. ReadProcessMemory(process, _fourthitem, fourthitem, 512, NULL);
  73. // 格式化字符串
  74. str1.Format("%s",firstitem);
  75. str2.Format("%s",secitem);
  76. str3.Format("%s",thirditem);
  77. str4.Format("%s",fourthitem);
  78. // 增加到列表
  79. nItem = m_ListCtrl.InsertItem(0,str1);
  80. m_ListCtrl.SetItem(nItem,1,1,str2,NULL,0,0,0);
  81. m_ListCtrl.SetItem(nItem,2,1,str3,NULL,0,0,0);
  82. m_ListCtrl.SetItem(nItem,3,1,str4,NULL,0,0,0);
  83. }
  84. // 释放内存空间
  85. VirtualFreeEx(process, _lvi,        0, MEM_RELEASE);
  86. VirtualFreeEx(process, _firstitem,  0, MEM_RELEASE);
  87. VirtualFreeEx(process, _secitem,    0, MEM_RELEASE);
  88. VirtualFreeEx(process, _thirditem,  0, MEM_RELEASE);
  89. VirtualFreeEx(process, _fourthitem, 0, MEM_RELEASE);
  90. }

读取文件列表:

view plaincopy to clipboardprint?
  1. void CTestDlg::OnBtnReadFile()
  2. {
  3. // TODO: Add your control notification handler code here
  4. m_ListCtrl.DeleteAllItems();
  5. int nRow;
  6. int j;
  7. nRow = m_ListCtrl.GetHeaderCtrl()->GetItemCount();
  8. for(j=0;j<=nRow;j++)
  9. {
  10. m_ListCtrl.DeleteColumn(0);
  11. }
  12. // 添加上面的列表头
  13. m_ListCtrl.InsertColumn(0,"文件名称",NULL,80, -1);
  14. m_ListCtrl.InsertColumn(1,"大小",NULL,60,-1);
  15. m_ListCtrl.InsertColumn(2,"类型",NULL,100,-1);
  16. m_ListCtrl.InsertColumn(3,"修改日期",NULL,120,-1);
  17. // 查找窗口句柄
  18. HWND    hWnd,hListview;
  19. hWnd=::FindWindow(NULL,_T("C:\\Documents and Settings\\Koma\\桌面\\Test"));
  20. hWnd=::FindWindowEx(hWnd,0,_T("SHELLDLL_DefView"),0);
  21. hWnd=::FindWindowEx(hWnd,0,_T("DUIViewWndClassName"),0);
  22. hWnd=::FindWindowEx(hWnd,0,_T("DirectUIHWND"),0);
  23. hWnd=::FindWindowEx(hWnd,0,_T("CtrlNotifySink"),0);
  24. hListview=::FindWindowEx(hWnd,0,_T("SysListView32"),NULL);
  25. if(!hListview)
  26. {
  27. MessageBox("Listview handle is NULL !");
  28. return;
  29. }
  30. ......
  31. }

3、程序运行效果:

4、程序不足:

A、在获取任务管理器“进程”标签内容时,因为有些列表项没有显示、即它的iSubItem项被设置隐藏(设置为0宽度即可),所以需要在“查看”/ “选择列”打开相关选项,不然你可能会觉得程序读错。(如果切换成“用户”标签则不会.)

B、在获取SysListView32句柄时,有些程序的ListCtrl某些列是可编辑的,这里我还没有搞明白为什么可编辑的没有获取到,比如像这样的:

(比如文件列表试图里,文件名是可以编辑的,获取这个又没有问题,这个编辑区域有点像个指定大小的EditBox,不知道这程序是如何重写的CListCtrl类,或是那个开源的项目,见过或用过的友友请说声哈!)

这种可编辑的ListCtrl内容该怎么获取,哪位兄弟知道的,麻烦你有空请告诉我一声吧!

VC获取其他进程ListCtrl内容相关推荐

  1. VC++获取文本框1内容在文本框2显示

    要想对文本框进行操作首先获得文本框的指针. 对于文本框类 就是CEdit类获取指针的方法是 CEdit *edit1=(CEdit*)GetDlgItem(IDC_EDIT1); 如果是静态文本控件的 ...

  2. VC获取父进程PID

    // tt.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h>   #include &l ...

  3. VC获取进程的cpu使用率、内存、线程数、句柄数等信息

    //ProcessInfoCollect.h //进程信息采集#pragma once//枚举进程 typedef BOOL(_stdcall *ENUMPROCESS)(DWORD *pProces ...

  4. vc 界面编程常用方法 listctrl toolbar

      vc 界面编程常用方法收藏 新一篇: Building SQLite3 with Visual Studio 2005 | 旧一篇: Visual Studio 2005 IDE 技巧和窍门 &l ...

  5. 笔记1:VC获取系统时间的方法

    笔记1:VC 获取系统时间的方法 推荐的获取方法 获取时间方法种类 各种获取时间方法详解 方法1:time_t变量 和 time(time_t*)方法 方法2:system(" time&q ...

  6. WIN32开发:如何获取父进程的ID

    众所周知,windows中的进程是可以有父子关系的,拥有父子关系的进程,一旦父进程结束,子进程有会随之退出.但是如果进程之间没有父子关系,我们如何让子进程在父进程退出是也同时跟着退出呢?方法有很多,本 ...

  7. python查看系统进程_在Python中获取操作系统的进程信息

    本文主要介绍在 Python 中使用 psutil 获取系统的进程信息. 1 概述 psutil 是 Python 的一个进程和系统工具集模块,通过使用 psutil,我们可以在 Python 中获取 ...

  8. java 线程不足_jvm - 如何在没有运行缺点的Windows上获取Java进程的线程和堆转储...

    jvm - 如何在没有运行缺点的Windows上获取Java进程的线程和堆转储 我有一个Java应用程序,我从控制台运行,然后控制台执行另一个Java进程. 我想获得该子进程的线程/堆转储. 在Uni ...

  9. 蛋壳公寓信息/信息网爬取/小猪短租/豆瓣/拉钩/人民邮电报/百度电视剧/加载更多-获取字符串中间任意内容

    调试 import requests from lxml import etreebase_url = 'https://www.danke.com/room/bj?page=1'headers = ...

最新文章

  1. python字符串打印教学_python字符串格式化教你正确打印 : D
  2. Algorithm:数学建模大赛之数学建模基础(经验/技巧)、流程(模型准备/模型假设/建模/求解/分析/优化/预测/评价)、论文写作(意义/摘要/关键词/问题重述和模型假设/建模/文献)之详细攻略
  3. 2020 年 4 月全国程序员工资新鲜出炉,我拖后腿了!
  4. asp用于取代什么技术_ASP是不是已经被淘汰了?
  5. 试题导入mysql乱码_解决Mysql导入乱码问题
  6. Java黑皮书课后题第9章:*9.4(使用Random类)编写一个程序,创建一个种子为1000的Random对象,然后使用nextInt(100)方法显示0到100之间的前50个随机整数
  7. CIKERS Shane 20190530
  8. nginx介绍(一) 简介篇
  9. vue ---- webpack -插件 html-webpack-plugin
  10. 在Razor中如何引入命名空间?(import namespace in razor view)
  11. 刘强东深夜写信诉苦;华为不排斥卖给苹果 5G 芯片;Facebook 再宕机 | 极客头条...
  12. jquery.form.js ajax提交上传文件
  13. TFTP 服务器的配置
  14. 将Word转换成Pdf
  15. 读懂才会用 : 瞅瞅Redis的epoll模型
  16. unity3d_打飞碟
  17. 世界芯中国芯RISC-V相关资源及进展
  18. linux zip分卷压缩解压命令
  19. 天使之火Angelfire:CIA入侵Windows系统的恶意软件
  20. python runner.daemonrunner_python3.3.4:pythondaemon3K;如何使用runn

热门文章

  1. mysql查询周数_MySQL:查询中从周数开始的周日期范围
  2. kettle获取当前日期_kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)...
  3. 重装了java然后说找不到路径,Java第三次作业第五题
  4. Shift Dot_JAVA
  5. Spring IOC 容器源码分析 - 获取单例 bean
  6. NumberUtils、ArrayUtils和RandomUtils工具类用法
  7. 从0开始学习 GitHub 系列之「初识 GitHub」
  8. matlab调用opencv的函数
  9. 【Accelerated C++】重点回顾
  10. 图像检索中BOW和LSH的一点理解