如何获取别的进程的TreeView控件的内容

类别:VC语言 点击:0 评论:0 推荐:

extern "C" long EXPORT __stdcall GetRootItem (long Thwnd,char *filestr) {
 TVITEM  tvi,  *_tvi;
 char  *_item;
 char item[256];
 unsigned  long  pid; 
 HANDLE  process;
 long ret=(long)((CTreeCtrl*)CWnd::FromHandle((HWND)Thwnd))->GetRootItem();
 if (ret) {
  /*
  GetWindowThreadProcessId
  说明
  获取与指定窗口关联在一起的一个进程和线程标识符
  返回值
  Long,拥有窗口的线程的标识符
  参数表
  参数 类型及说明
  lpdwProcessId Long,指定一个变量,用于装载拥有那个窗口的一个进程的标识符
  hwnd Long,指定窗口句柄
  */
  GetWindowThreadProcessId((HWND)Thwnd,  &pid);
  //用全部权限打开进程
  process=OpenProcess(PROCESS_VM_OPERATION  |PROCESS_VM_READ  | PROCESS_VM_WRITE  |PROCESS_QUERY_INFORMATION,  FALSE,  pid); 
  //给_lvi,_item分配进程级的虚拟内存空间
  _tvi=(TVITEM*)VirtualAllocEx(process,  NULL,  sizeof(TVITEM), MEM_COMMIT,  PAGE_READWRITE); 
  _item=(char*)VirtualAllocEx(process,  NULL,  256,  MEM_COMMIT,  PAGE_READWRITE);    
  tvi.cchTextMax=256;
  tvi.hItem=(HTREEITEM)ret;
  tvi.mask=TVIF_TEXT;
  tvi.pszText=_item;
  //把_lvi写入进程
  WriteProcessMemory(process,  _tvi,  &tvi,  sizeof(TVITEM),  NULL); 
  //发消息得到数据
  ::SendMessage((HWND)Thwnd,  TVM_GETITEM, 0 ,  (LPARAM)_tvi);
  //从进程中读出数据
  ReadProcessMemory(process,  _item,  item,  256,  NULL);
  //copy data
  memcpy(filestr,item,256);
  //free memory
  VirtualFreeEx(process,  _tvi,  0,  MEM_RELEASE); 
  VirtualFreeEx(process,  _item,  0,  MEM_RELEASE);
 }
 return ret;
}

extern "C" long EXPORT __stdcall GetNextItem (HWND Thwnd,long next,char *filestr) {
 TVITEM  tvi,  *_tvi;
 char item[256];
 char  *_item;
 unsigned  long  pid; 
 HANDLE  process;
 long ret=(long)((CTreeCtrl*)CWnd::FromHandle(Thwnd))->GetNextSiblingItem((HTREEITEM)next);
 if (ret) {
  GetWindowThreadProcessId(Thwnd,  &pid); 
  process=OpenProcess(PROCESS_VM_OPERATION  |PROCESS_VM_READ  | PROCESS_VM_WRITE  |PROCESS_QUERY_INFORMATION,  FALSE,  pid); 
  _tvi=(TVITEM*)VirtualAllocEx(process,  NULL,  sizeof(TVITEM), MEM_COMMIT,  PAGE_READWRITE); 
  _item=(char*)VirtualAllocEx(process,  NULL,  256,  MEM_COMMIT,  PAGE_READWRITE);    
  tvi.cchTextMax=256;
  tvi.hItem=(HTREEITEM)ret;
  tvi.mask=TVIF_TEXT;
  tvi.pszText=_item; 
  WriteProcessMemory(process,  _tvi,  &tvi,  sizeof(TVITEM),  NULL); 
  ::SendMessage(Thwnd,  TVM_GETITEM, 0 ,  (LPARAM)_tvi);
  ReadProcessMemory(process,  _item,  item,  256,  NULL);
  memcpy(filestr,item,256);
  VirtualFreeEx(process,  _tvi,  0,  MEM_RELEASE); 
  VirtualFreeEx(process,  _item,  0,  MEM_RELEASE);
  
 }
 return ret;
}
以上的函数可以放到dll中在vb,vc里调用,但如果机器没装vc,在vb里调用需要MFC42D.DLL,MSVCRTD.DLL。

本文地址:http://com.8s8s.com/it/it308.htm