extern "C" long EXPORT __stdcall GetRootItem (long Thwnd,char *filestr) { TVITEM tvi, *_tvi; char *_item; char item[256]; unsigned long pid; HANDLE process; long ret=(long)((CTreeCtrl*)CWnd::FromHandle((HWND)Thwnd))->GetRootItem(); if (ret) { /* GetWindowThreadProcessId 说明 获取与指定窗口关联在一起的一个进程和线程标识符 返回值 Long,拥有窗口的线程的标识符 参数表 参数 类型及说明 lpdwProcessId Long,指定一个变量,用于装载拥有那个窗口的一个进程的标识符 hwnd Long,指定窗口句柄 */ GetWindowThreadProcessId((HWND)Thwnd, &pid); //用全部权限打开进程 process=OpenProcess(PROCESS_VM_OPERATION |PROCESS_VM_READ | PROCESS_VM_WRITE |PROCESS_QUERY_INFORMATION, FALSE, pid); //给_lvi,_item分配进程级的虚拟内存空间 _tvi=(TVITEM*)VirtualAllocEx(process, NULL, sizeof(TVITEM), MEM_COMMIT, PAGE_READWRITE); _item=(char*)VirtualAllocEx(process, NULL, 256, MEM_COMMIT, PAGE_READWRITE); tvi.cchTextMax=256; tvi.hItem=(HTREEITEM)ret; tvi.mask=TVIF_TEXT; tvi.pszText=_item; //把_lvi写入进程 WriteProcessMemory(process, _tvi, &tvi, sizeof(TVITEM), NULL); //发消息得到数据 ::SendMessage((HWND)Thwnd, TVM_GETITEM, 0 , (LPARAM)_tvi); //从进程中读出数据 ReadProcessMemory(process, _item, item, 256, NULL); //copy data memcpy(filestr,item,256); //free memory VirtualFreeEx(process, _tvi, 0, MEM_RELEASE); VirtualFreeEx(process, _item, 0, MEM_RELEASE); } return ret; }
extern "C" long EXPORT __stdcall GetNextItem (HWND Thwnd,long next,char *filestr) { TVITEM tvi, *_tvi; char item[256]; char *_item; unsigned long pid; HANDLE process; long ret=(long)((CTreeCtrl*)CWnd::FromHandle(Thwnd))->GetNextSiblingItem((HTREEITEM)next); if (ret) { GetWindowThreadProcessId(Thwnd, &pid); process=OpenProcess(PROCESS_VM_OPERATION |PROCESS_VM_READ | PROCESS_VM_WRITE |PROCESS_QUERY_INFORMATION, FALSE, pid); _tvi=(TVITEM*)VirtualAllocEx(process, NULL, sizeof(TVITEM), MEM_COMMIT, PAGE_READWRITE); _item=(char*)VirtualAllocEx(process, NULL, 256, MEM_COMMIT, PAGE_READWRITE); tvi.cchTextMax=256; tvi.hItem=(HTREEITEM)ret; tvi.mask=TVIF_TEXT; tvi.pszText=_item; WriteProcessMemory(process, _tvi, &tvi, sizeof(TVITEM), NULL); ::SendMessage(Thwnd, TVM_GETITEM, 0 , (LPARAM)_tvi); ReadProcessMemory(process, _item, item, 256, NULL); memcpy(filestr,item,256); VirtualFreeEx(process, _tvi, 0, MEM_RELEASE); VirtualFreeEx(process, _item, 0, MEM_RELEASE); } return ret; } 以上的函数可以放到dll中在vb,vc里调用,但如果机器没装vc,在vb里调用需要MFC42D.DLL,MSVCRTD.DLL。 
|