您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 4浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

VC获取其他进程ListCtrl内容

phymat.nico 发布时间:2015-01-08 11:25:24 ,浏览量:4

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

1、捕获窗口句柄:

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

    SPY++

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

    设置样式

2、相关代码:

view plain copy to clipboard print ?
  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. }  
view plain copy to clipboard print ?
  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. }  

读取文件列表:

view plain copy to clipboard print ?
  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
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0451s