选中指定的磁盘

参数:

_hwnd:“浏览文件夹”窗口下的树句柄

_csDiskLable:要选中的磁盘盘符

BOOL H2TestBase::SelectDisk(const HWND _hwnd, CString _csDiskLable)
{
 CString text;
 const int bufferLength = 4000;
 DWORD processId = NULL;
 LPTVITEM item = (LPTVITEM)new BYTE[bufferLength];
 GetWindowThreadProcessId(_hwnd,&processId);
 HANDLE process = ::OpenProcess(PROCESS_VM_OPERATION |PROCESS_VM_READ |PROCESS_VM_WRITE,false,processId);
 PVOID buffer = VirtualAllocEx(process,NULL,bufferLength,MEM_COMMIT,PAGE_READWRITE);
 item->mask = TVIF_TEXT;
 item->cchTextMax = 512;
 item->pszText = LPTSTR((PBYTE)buffer+sizeof(TVITEM));
 item->hItem = (HTREEITEM)::SendMessage(_hwnd,TVM_GETNEXTITEM,TVGN_ROOT,0);

 while(item->hItem)
 {
  ::SendMessage(_hwnd,TVM_GETNEXTITEM,TVGN_NEXTVISIBLE,(long)item->hItem);
  WriteProcessMemory(process,buffer,item,sizeof(TVITEM),NULL);
  ::SendMessage(_hwnd,TVM_GETITEM,0,(LPARAM)buffer);
  ReadProcessMemory(process,buffer,item,bufferLength,NULL);

  text = (LPTSTR)((PBYTE)item+sizeof(TVITEM));

  if( text.Find("我的电脑") != -1)
  {
   // 展开“我的电脑”
   ::SendMessage(_hwnd,TVM_SELECTITEM,TVGN_CARET,(long)item->hItem);
   HTREEITEM hItemComputer = item->hItem;
   // 这里必须延时,展开我的电脑之后才能进行下面的操作

   // 获取"我的电脑"的第一个子项,可能出现读不到的现象,多次读保证读到
   for (int i=0; i<200; i++)
   {
    item->hItem = (HTREEITEM)::SendMessage(_hwnd,TVM_GETNEXTITEM,TVGN_CHILD,(long)hItemComputer);
    if (NULL != item->hItem)
    {
     break;
    }
    Sleep(10);
   }

   WriteProcessMemory(process,buffer,item,sizeof(TVITEM),NULL);
   ::SendMessage(_hwnd,TVM_GETITEM,0,(LPARAM)buffer);
   ReadProcessMemory(process,buffer,item,bufferLength,NULL);

   text = (LPTSTR)((PBYTE)item+sizeof(TVITEM));
   if (text.Find(_csDiskLable) != -1)
   {
    // 获取我的电脑的第一个子项,判断是否是要找的可移动盘
    // 如果是就选定
    ::SendMessage(_hwnd,TVM_SELECTITEM,TVGN_CARET,(long)item->hItem);
    delete []item;
    return TRUE;
   }
   else
   {
    // 不是就找该子项的下一个兄弟项,直到找到,或者为NULL
    BYTE FindTimes = 5;
              HTREEITEM DiskCitem = item->hItem;
    while(FindTimes--)
    {
     item->hItem = DiskCitem;
     while(item->hItem)
     {
      item->hItem = (HTREEITEM)::SendMessage(_hwnd,TVM_GETNEXTITEM,TVGN_NEXT,(long)item->hItem);
      WriteProcessMemory(process,buffer,item,sizeof(TVITEM),NULL);
      ::SendMessage(_hwnd,TVM_GETITEM,0,(LPARAM)buffer);
      ReadProcessMemory(process,buffer,item,bufferLength,NULL);

      text = (LPTSTR)((PBYTE)item+sizeof(TVITEM));
      if (text.Find(_csDiskLable) != -1)
      {
       // 是就选定
       ::SendMessage(_hwnd,TVM_SELECTITEM,TVGN_CARET,(long)item->hItem);
       delete []item;
       return TRUE;
      }
     }
    }
    if (NULL == item->hItem)
    {
     delete []item;
     return FALSE;
    }
   }
  }

  else
  {
   item->hItem = (HTREEITEM)::SendMessage(_hwnd,TVM_GETNEXTITEM,TVGN_NEXTVISIBLE,(long)item->hItem);
  }
 }
 delete []item;
 return FALSE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值