如何点击WIN7的"计算机"窗口的sysTreeview32,使其右边窗口可以跳转?

swdraven2015 2015-08-28 05:47:35
查找子节点,选中子节点,获取子节点的坐标都已经实现了,但是点击子节点,使计算机窗口右边跳转到相应地址,这个功能实现不了。网上都说用CreateRemoteThread来实现,但是都没贴代码出来,没有参考,所以来这里求大家帮个忙。有一点不明白的是,注入一个线程到“计算机”中,可以做些什么?怎么使用我的线程去控制“计算机”点击节点的动作?其实注入线程能做些什么呢?网上的例子都是简单的演示一下,就是调用一个MessageBox,没起到什么大作用啊?

下面是我写的代码,麻烦各位帮忙提点一下小弟。
   
//这段是找到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));

}
...全文
274 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2015-08-31
  • 打赏
  • 举报
回复
都是靠文本查找和对比
schlafenhamster 2015-08-31
  • 打赏
  • 举报
回复
需要通知 右边 listview TVN_SELCHANGED
swdraven2015 2015-08-31
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
在 Tree 的双击 Expand 中 再选择当前项 Select
我也试过了,发这个消息 ::SendMessage(hwnd,TVM_SELECTITEM,TVGN_CARET,(long)item->hItem); 但是它也只是在tree上面选中了节点而已,右边窗口仍然没有链接到指定位置。
schlafenhamster 2015-08-31
  • 打赏
  • 举报
回复
在 Tree 的双击 Expand 中 再选择当前项 Select
swdraven2015 2015-08-31
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
左 边 Tree 双击 就是 Expand “右边窗口可以跳转” 什么 意思 ?
expand只能展开,但是右边的窗口不会链接到那个展开的位置,只是左边的Tree展开了而已。
schlafenhamster 2015-08-29
  • 打赏
  • 举报
回复
左 边 Tree 双击 就是 Expand “右边窗口可以跳转” 什么 意思 ?
swdraven2015 2015-08-29
  • 打赏
  • 举报
回复
顶一顶,怎么都没人呢?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧