15,471
社区成员
发帖
与我相关
我的任务
分享
//这段是找到C盘并展开的代码。
CStringArray strArr;
int k;
HWND hwnd;
CString text;
const int bufferLength = 4000;
DWORD processId = NULL;
LPTVITEM item = (LPTVITEM)new BYTE[bufferLength];
hwnd = ::FindWindow( _T("CabinetWClass"), _T("计算机") );
HWND computerHwnd = hwnd;
hwnd = ::FindWindowEx( hwnd, NULL, _T("ShellTabWindowClass"), _T("计算机") );
hwnd = ::FindWindowEx( hwnd, NULL, _T("DUIViewWndClassName"), _T("") );
HWND dxHwnd = ::FindWindowEx( hwnd, NULL, _T("DirectUIHWND"), _T("") );
HWND ctrlNotify1Hwnd = ::FindWindowEx( dxHwnd, NULL, _T("CtrlNotifySink"), _T("") );
HWND ctrlNotify2Hwnd = ::FindWindowEx( dxHwnd, ctrlNotify1Hwnd, _T("CtrlNotifySink"), _T("") );
hwnd = ::FindWindowEx( ctrlNotify1Hwnd, NULL, _T("NamespaceTreeControl"), _T("命名空间树控件") );
if( hwnd == NULL )
{
hwnd = ::FindWindowEx( ctrlNotify2Hwnd, NULL, _T("NamespaceTreeControl"), _T("命名空间树控件") );
}
hwnd = ::FindWindowEx( hwnd, NULL, _T("SysTreeView32"), _T("树视图") );
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));//(LPSTR)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
item->hItem = (HTREEITEM)::SendMessage(hwnd,TVM_GETNEXTITEM,TVGN_ROOT,0);
while(item->hItem)
{
::SendMessage(hwnd,TVM_SELECTITEM,TVGN_CARET,(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( -1 != text.Find("本地磁盘 (C:)")
{
::SendMessage(hwnd,TVM_EXPAND,TVE_EXPAND,(long)item->hItem);
::SendMessage(hwnd, TVM_SELECTITEM,TVGN_CARET, (long)item->hItem);
break;
}
item->hItem = (HTREEITEM)::SendMessage(hwnd,TVM_GETNEXTITEM,TVGN_NEXTVISIBLE,(long)item->hItem);
}
//这段是获取C盘这个节点的位置代码
RECT rc;
HTREEITEM TreeItem;
DWORD processId2 = NULL;
GetWindowThreadProcessId(hwnd,&processId2);
HANDLE process2 = ::OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,false,processId2);
LPVOID buffer2 = VirtualAllocEx(process, NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (buffer2 != NULL)
{
SIZE_T bytes;
WriteProcessMemory(process, buffer2, &item->hItem, sizeof(item->hItem), &bytes);
bool result = (::SendMessage(hwnd, TVM_GETITEMRECT, FALSE, (LPARAM)buffer2) != 0);
ReadProcessMemory(process, buffer2, &rc, sizeof(RECT), &bytes);
POINT pt={0};
pt.x = rc.left + (rc.right-rc.left)/2;
pt.y = rc.top + (rc.bottom-rc.top)/2;
//这个地方,发送了消息,计算机窗口也响应了,但是只是把本来已经展开的C盘再次折叠了,没有起到跳转的作用。
::SendMessage(hwnd, WM_LBUTTONDBLCLK, (WPARAM)&item->hItem, MAKELONG((WORD)pt.x,(WORD)pt.y));
}