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

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

 2007-10-04 20:11:12 来源:WEB开发网   
核心提示:/*Tree-View Control_Demo_SeqSearch 1.0 版 *版权所有 (C) 2006 天津 赵春生 *2006.08.28 *http://timw.yeah.net *http://timw.126.com *本程序能按用户指定的项目名称顺序查找TV控件中的项目, *代码在Win2000P+

/*  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:遍历 查找 外部

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接