生活随笔
收集整理的這篇文章主要介紹了
VC获取其他进程ListCtrl内容
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
VC讀寫其他進程ListCtrl數據到本進程的實例,下面用Windows任務管理器來做測試:
1、捕獲窗口句柄:
???? 用SPY++可以看到如下父子窗口關系:
???
???? 添加ListCtrl,設置style / Report、關聯控件變量m_ListCtrl,再添加一個按鈕,如下圖:
???
2、相關代碼:
view plaincopy to clipboardprint?
BOOL?CTestDlg::OnInitDialog()?? {?? ????CDialog::OnInitDialog();?? ????......?? ?????? ?????? ????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;???? }??
view plaincopy to clipboardprint? void?CTestDlg::OnBtnRead()??? {?? ?????? ????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;?? ?? ?????? ????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);?? ?? ?????? ????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);?? }??
讀取文件列表:
view plaincopy to clipboardprint? void?CTestDlg::OnBtnReadFile()??? {?? ?????? ????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;?? ????}?? ????......?? }??
3、程序運行效果:
???
??
4、程序不足:
???? A、在獲取任務管理器“進程”標簽內容時,因為有些列表項沒有顯示、即它的iSubItem項被設置隱藏(設置為0寬度即可),所以需要在“查看”/ “選擇列”打開相關選項,不然你可能會覺得程序讀錯。(如果切換成“用戶”標簽則不會.)
???? B、在獲取SysListView32句柄時,有些程序的ListCtrl某些列是可編輯的,這里我還沒有搞明白為什么可編輯的沒有獲取到,比如像這樣的:
???
????
?(比如文件列表試圖里,文件名是可以編輯的,獲取這個又沒有問題,這個編輯區域有點像個指定大小的EditBox,不知道這程序是如何重寫的CListCtrl類,或是那個開源的項目,見過或用過的友友請說聲哈!)
這種可編輯的ListCtrl內容該怎么獲取,哪位兄弟知道的,麻煩你有空請告訴我一聲吧!
總結
以上是生活随笔為你收集整理的VC获取其他进程ListCtrl内容的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。