VC获取其他进程ListCtrl内容
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
只回答业务咨询
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
VC读写其他进程ListCtrl数据到本进程的实例,下面用Windows任务管理器来做测试:
1、捕获窗口句柄:
用SPY++可以看到如下父子窗口关系:
添加ListCtrl,设置style / Report、关联控件变量m_ListCtrl,再添加一个按钮,如下图:
2、程序运行效果:
3、程序不足:
A、在获取任务管理器“进程”标签内容时,因为有些列表项没有显示、即它的iSubItem项被设置隐藏(设置为0宽度即可),所以需要在“查看”/ “选择列”打开相关选项,不然你可能会觉得程序读错。(如果切换成“用户”标签则不会.)
B、在获取SysListView32句柄时,有些程序的ListCtrl某些列是可编辑的,这里我还没有搞明白为什么可编辑的没有获取到,比如像这样的:
(比如文件列表试图里,文件名是可以编辑的,获取这个又没有问题,这个编辑区域有点像个指定大小的EditBox,不知道这程序是如何重写的CListCtrl类,或是那个开源的项目,见过或用过的友友请说声哈!)
这种可编辑的ListCtrl内容该怎么获取,哪位兄弟知道的,麻烦你有空请告诉我一声吧!
4.相关代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); ...... // TODO: Add extra initialization here // 设置ListCtrl窗口样式 LONG lStyle = m_ListCtrl.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE); lStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES; m_ListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,(LPARAM)lStyle); // 添加上面的列表头 m_ListCtrl.InsertColumn(0,"映像名称",NULL,100, -1); m_ListCtrl.InsertColumn(1,"PID",NULL,60,-1); m_ListCtrl.InsertColumn(2,"用户名",NULL,120,-1); m_ListCtrl.InsertColumn(3,"CPU",NULL,60,-1); return TRUE; // return TRUE unless you set the focus to a control } void CTestDlg::OnBtnRead() { // TODO: Add your control notification handler code here m_ListCtrl.DeleteAllItems(); // 查找窗口句柄 HWND hWnd,hListview; hWnd=::FindWindow(NULL,_T("Windows 任务管理器")); hWnd=::FindWindowEx(hWnd,0,"#32770",0); hListview=::FindWindowEx(hWnd,0,_T("SysListView32"),NULL); if(!hListview) { MessageBox("Listview handle is NULL !"); return; } int count = (int)::SendMessage(hListview,LVM_GETITEMCOUNT,0,0); int i,nItem; // 获取ListView行数 CString strTemp; strTemp.Format("总共%d行记录",count); MessageBox(strTemp); CString str1=""; CString str2=""; CString str3=""; CString str4=""; DWORD pid; HANDLE process; LVITEM lvi, *_lvi; char firstitem[512], secitem[512],thirditem[512],fourthitem[512]; char *_firstitem, *_secitem,*_thirditem,*_fourthitem; memset(firstitem,0,512); memset(secitem,0,512); memset(thirditem,0,512); memset(fourthitem,0,512); // 获取窗口PID、打开进程 GetWindowThreadProcessId(hListview, &pid); process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ| PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid); // 申请内存空间 _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE); _firstitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE); _secitem =(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE); _thirditem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE); _fourthitem=(char*)VirtualAllocEx(process,NULL, 512, MEM_COMMIT,PAGE_READWRITE); lvi.cchTextMax=512; // 这里应该递减、保持与任务管理器一样顺序 for(i=count; i>=0; i--) { // 获取第一列记录 lvi.iSubItem=0; lvi.pszText=_firstitem; WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); // 获取第二列记录 lvi.iSubItem=1; lvi.pszText=_secitem; WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); // 获取第三列记录 lvi.iSubItem=2; lvi.pszText=_thirditem; WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); // 获取第四列记录 lvi.iSubItem=3; lvi.pszText=_fourthitem; WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL); ::SendMessage(hListview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); // 读取进程内存 ReadProcessMemory(process, _firstitem, firstitem, 512, NULL); ReadProcessMemory(process, _secitem, secitem, 512, NULL); ReadProcessMemory(process, _thirditem, thirditem, 512, NULL); ReadProcessMemory(process, _fourthitem, fourthitem, 512, NULL); // 格式化字符串 str1.Format("%s",firstitem); str2.Format("%s",secitem); str3.Format("%s",thirditem); str4.Format("%s",fourthitem); // 增加到列表 nItem = m_ListCtrl.InsertItem(0,str1); m_ListCtrl.SetItem(nItem,1,1,str2,NULL,0,0,0); m_ListCtrl.SetItem(nItem,2,1,str3,NULL,0,0,0); m_ListCtrl.SetItem(nItem,3,1,str4,NULL,0,0,0); } // 释放内存空间 VirtualFreeEx(process, _lvi, 0, MEM_RELEASE); VirtualFreeEx(process, _firstitem, 0, MEM_RELEASE); VirtualFreeEx(process, _secitem, 0, MEM_RELEASE); VirtualFreeEx(process, _thirditem, 0, MEM_RELEASE); VirtualFreeEx(process, _fourthitem, 0, MEM_RELEASE); } 读取文件列表: void CTestDlg::OnBtnReadFile() { // TODO: Add your control notification handler code here m_ListCtrl.DeleteAllItems(); int nRow; int j; nRow = m_ListCtrl.GetHeaderCtrl()->GetItemCount(); for(j=0;j<=nRow;j++) { m_ListCtrl.DeleteColumn(0); } // 添加上面的列表头 m_ListCtrl.InsertColumn(0,"文件名称",NULL,80, -1); m_ListCtrl.InsertColumn(1,"大小",NULL,60,-1); m_ListCtrl.InsertColumn(2,"类型",NULL,100,-1); m_ListCtrl.InsertColumn(3,"修改日期",NULL,120,-1); // 查找窗口句柄 HWND hWnd,hListview; hWnd=::FindWindow(NULL,_T("C://Documents and Settings//Koma//桌面//Test")); hWnd=::FindWindowEx(hWnd,0,_T("SHELLDLL_DefView"),0); hWnd=::FindWindowEx(hWnd,0,_T("DUIViewWndClassName"),0); hWnd=::FindWindowEx(hWnd,0,_T("DirectUIHWND"),0); hWnd=::FindWindowEx(hWnd,0,_T("CtrlNotifySink"),0); hListview=::FindWindowEx(hWnd,0,_T("SysListView32"),NULL); if(!hListview) { MessageBox("Listview handle is NULL !"); return; } ...... } |
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=406