开发学院软件开发VC 遍历和查找外部程序 Tree-View 中的项目 阅读

遍历和查找外部程序 Tree-View 中的项目

 2007-03-17 21:59:26 来源:WEB开发网   
核心提示: /*Tree-View Control_Demo_SeqSearch 1.0 版*版权所有 (C) 2006 天津 赵春生*2006.08.28*http://timw.yeah.net*http://timw.126.com*本程序能按用户指定的项目名称顺序查找TV控件中的项目,*代码在
  /*  Tree-View Control_Demo_SeqSearch 1.0 版
  *  版权所有 (C) 2006 天津 赵春生
  *  2006.08.28
  *  http://timw.yeah.net
  *  http://timw.126.com
  *  本程序能按用户指定的项目名称顺序查找TV控件中的项目。
  *  代码在Win2000P+SP4 + VC6+SP6测试通过。
  */
  if(error==0)//如果在数据验证转换的过程中未出现错误(error==0时无错误)
  {
    
    //下面为核心部分:按用户指定的项目名称顺序查找Tree-View控件中的Item.
    
    hwnd=HWND(dec_sum);//得到转换后的数据
    
    GetWindowThreadProcessId(hwnd, &PID);
    
    hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    if (!hProcess)
      MessageBox("获取进程句柄操作失败!","错误!");
    else
    {
      ptvitem=(TVITEM*)VirtualAllocEx(hProcess,
            NULL,
            sizeof(TVITEM),
            MEM_COMMIT,
            PAGE_READWRITE);
      pItem=(char*)VirtualAllocEx(hProcess,
            NULL,
            16,
            MEM_COMMIT,
            PAGE_READWRITE);
      
      if (!ptvitem)
        MessageBox("无法分配内存!","错误!");
      else
      {
        MessageBox("本演示程序将按用户指定的项目名称顺序查找。","提示");
        
        tvitem.mask=TVIF_TEXT;
        tvitem.cchTextMax=512;
        tvitem.pszText=pItem;
        
        //得到根句柄
        tvitem.hItem=(HTREEITEM)::SendMessage(hwnd,
                TVM_GETNEXTITEM,
                TVGN_ROOT,
                0x0);
        //选中状态
        ::SendMessage(hwnd,
              TVM_SELECTITEM,
              TVGN_CARET,
              (long)tvitem.hItem);
        
        //将设置好的结构插入目标进程
        WriteProcessMemory(hProcess,
                ptvitem,
                &tvitem,   
                sizeof(TVITEM), NULL);
        //发送TVM_GETITEM消息
        ::SendMessage(hwnd,
              TVM_GETITEM,
              0,
              (LPARAM)ptvitem);
        //获取pszText
        ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
        //MessageBox(ItemBuf,"ITEM TEXT");
        if( strnicmp( ItemBuf,
              str_item_text,
              strlen(str_item_text) ) == 0)
        {
          MessageBox("已经找到!","恭喜");
          Bingo=1;
          //如果根就是我们要找的目标,那么程序执行到这里就可以结束了。
          tvitem.hItem=(HTREEITEM)0x0;
        }
        
        while((long)tvitem.hItem)
        {
          //当此项目能展开时
          while(::SendMessage(hwnd,
                  TVM_EXPAND,
                  TVE_EXPAND,
                  (long)tvitem.hItem))
          {
            //选择下一个可见项目
            tvitem.hItem=(HTREEITEM)::SendMessage(hwnd,
                TVM_GETNEXTITEM,TVGN_NEXTVISIBLE,
                (long)tvitem.hItem);
            //选中状态
            ::SendMessage(hwnd,
              TVM_SELECTITEM,TVGN_CARET,
              (long)tvitem.hItem);
            //将设置好的结构插入目标进程
            WriteProcessMemory(hProcess,
                ptvitem,
                &tvitem,
                sizeof(TVITEM),
                NULL);
            //发送TVM_GETITEM消息
            ::SendMessage(hwnd,
              TVM_GETITEM,
              0,
              (LPARAM)ptvitem);
            //获取pszText
            ReadProcessMemory(hProcess,
                pItem,
                ItemBuf,
                512,
                NULL);
            //MessageBox(ItemBuf,"ITEM TEXT");
            if( strnicmp( ItemBuf,
                  str_item_text,
                  strlen(str_item_text) ) == 0)
            {
              MessageBox("已经找到!","恭喜");
              Bingo=1;
              //如果发现我们要找的目标,那么程序执行到这里就可以结束了。
              tvitem.hItem=(HTREEITEM)0x0;
              break;
            }
            continue;
          }
          
          if(Bingo!=1)
          {
            //当不能再展开的时候,选择下一个可见项目
            tvitem.hItem=(HTREEITEM)::SendMessage(hwnd,
                  TVM_GETNEXTITEM,TVGN_NEXTVISIBLE,
                  (long)tvitem.hItem);
            //选中状态
            ::SendMessage(hwnd,
                  TVM_SELECTITEM,
                  TVGN_CARET,
                  (long)tvitem.hItem);
            //将设置好的结构插入目标进程
            WriteProcessMemory(hProcess,
                      ptvitem,
                      &tvitem,
                      sizeof(TVITEM),
                      NULL);
            //发送TVM_GETITEM消息
            ::SendMessage(hwnd,
                  TVM_GETITEM,
                  0,
                  (LPARAM)ptvitem);
                  
            ReadProcessMemory(hProcess,
                    pItem,
                    ItemBuf,
                    512,
                    NULL);//获取pszText
                    
            //MessageBox(ItemBuf,"ITEM TEXT");
            if( strnicmp( ItemBuf,
                    str_item_text,
                    strlen(str_item_text) ) == 0)
            {
              MessageBox("已经找到!","恭喜");
              Bingo=1;
              //如果发现我们要找的目标,那么程序执行到这里就可以结束了。
              tvitem.hItem=(HTREEITEM)0x0;
              break;
            }
          }
          
        }
      }
    }
  }
  
  //释放内存
  CloseHandle(hwnd);
  CloseHandle(hProcess);
  VirtualFreeEx(hProcess, ptvitem, 0, MEM_RELEASE);
  //顺序查找完毕
结束语

代码写得不够幽雅,大家见笑了。在此之前,类似的拙文我已经写了四篇,希望大家看完后能举一反三。谢谢。

上一页  1 2 3 4 

Tags:遍历 查找 外部

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接