中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
如何获取别的进程的TreeView控件的内容
作者:未知 时间:2005-07-27 21:54 出处:CSDN 责编:chinaitpower
              摘要:如何获取别的进程的TreeView控件的内容

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。


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有