VC获取其他进程ListCtrl内容

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

 

1、捕获窗口句柄:

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

    SPY++

 

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

    设置样式

 

2、相关代码:

  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.     // 添加上面的列表头  
  12.     m_ListCtrl.InsertColumn(0,"映像名称",NULL,100, -1);  
  13.     m_ListCtrl.InsertColumn(1,"PID",NULL,60,-1);  
  14.     m_ListCtrl.InsertColumn(2,"用户名",NULL,120,-1);  
  15.     m_ListCtrl.InsertColumn(3,"CPU",NULL,60,-1);  
  16.     return TRUE;  // return TRUE  unless you set the focus to a control  
  17. }  

 

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

 

读取文件列表:

  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.     // 添加上面的列表头  
  14.     m_ListCtrl.InsertColumn(0,"文件名称",NULL,80, -1);  
  15.     m_ListCtrl.InsertColumn(1,"大小",NULL,60,-1);  
  16.     m_ListCtrl.InsertColumn(2,"类型",NULL,100,-1);  
  17.     m_ListCtrl.InsertColumn(3,"修改日期",NULL,120,-1);  
  18.       
  19.     // 查找窗口句柄  
  20.     HWND    hWnd,hListview;  
  21.     hWnd=::FindWindow(NULL,_T("C://Documents and Settings//Koma//桌面//Test"));     
  22.     hWnd=::FindWindowEx(hWnd,0,_T("SHELLDLL_DefView"),0);  
  23.     hWnd=::FindWindowEx(hWnd,0,_T("DUIViewWndClassName"),0);  
  24.     hWnd=::FindWindowEx(hWnd,0,_T("DirectUIHWND"),0);  
  25.     hWnd=::FindWindowEx(hWnd,0,_T("CtrlNotifySink"),0);  
  26.     hListview=::FindWindowEx(hWnd,0,_T("SysListView32"),NULL);  
  27.     if(!hListview)  
  28.     {  
  29.         MessageBox("Listview handle is NULL !");  
  30.         return;  
  31.     }  
  32.     ......  
  33. }  

 

3、程序运行效果:

   测试效果

 

   文件列表

 

4、程序不足:

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

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

   可编辑

    

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

 

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

 

详情请查看此贴:

http://www.codeproject.com/Messages/3244596/How-to-read-the-characters-in-the-EditTable-of-Sys.aspx

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值