日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC获取其他进程ListCtrl内容

發布時間:2025/3/21 c/c++ 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC获取其他进程ListCtrl内容 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

VC讀寫其他進程ListCtrl數據到本進程的實例,下面用Windows任務管理器來做測試:

1、捕獲窗口句柄:

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

???

???? 添加ListCtrl,設置style / Report、關聯控件變量m_ListCtrl,再添加一個按鈕,如下圖:

???

2、相關代碼:

view plaincopy to clipboardprint?
  • 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??
  • }??
  • view plaincopy to clipboardprint?
  • 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);??
  • }??
  • 讀取文件列表:

    view plaincopy to clipboardprint?
  • 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;??
  • ????}??
  • ????......??
  • }??
  • 3、程序運行效果:

    ???

    ??

    4、程序不足:

    ???? A、在獲取任務管理器“進程”標簽內容時,因為有些列表項沒有顯示、即它的iSubItem項被設置隱藏(設置為0寬度即可),所以需要在“查看”/ “選擇列”打開相關選項,不然你可能會覺得程序讀錯。(如果切換成“用戶”標簽則不會.)

    ???? B、在獲取SysListView32句柄時,有些程序的ListCtrl某些列是可編輯的,這里我還沒有搞明白為什么可編輯的沒有獲取到,比如像這樣的:

    ???

    ????

    ?(比如文件列表試圖里,文件名是可以編輯的,獲取這個又沒有問題,這個編輯區域有點像個指定大小的EditBox,不知道這程序是如何重寫的CListCtrl類,或是那個開源的項目,見過或用過的友友請說聲哈!)

    這種可編輯的ListCtrl內容該怎么獲取,哪位兄弟知道的,麻煩你有空請告訴我一聲吧!

    總結

    以上是生活随笔為你收集整理的VC获取其他进程ListCtrl内容的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。