参数:
_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;
}