获取TreeView内容的问题

X615769472 2018-12-16 10:10:23
想遍历获取资源管理器中每一个子项的标题,百度了好久,做出了一小段代码,但还是取不出类似 "最近访问的职位" 这样的标题,
类 - SysTreeView32,
hTreeView = 1379188 spy++查出来这个句柄,先直接用了,
我电脑中的Excel出现了问题,把主要code放在记事本中,请老师加以指点。





Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As String, ByVal Source As Long, ByVal Length As Long)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32.dll" (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32.dll" (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, llpBufferfer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Const TVGN_ROOT = &H0 '根项的第一个子项,指定项是该根项的一个部分
Private Const TVGN_CHILD = &H4 '第一个子项
Private Const TVGN_Next = &H1 '下一个兄弟项
Private Const TVGN_Caret = &H9 '选中的项目

Private Const TVGN_Previous = &H2 '前一个兄弟项
Private Const TVGN_Parent = &H3 '指定项的父项
Private Const TVGN_FirstVisible = &H5 '第一个可见的项
Private Const TVGN_NextVisible = &H6 '跟随在指定项之后的下一个可视项
Private Const TVGN_PreviousVisible = &H7 '在指定项之前的第一个可视项
Private Const TVGN_LastVisible = &H10

Private Const TVGN_DropHilite = &H8 '上一次拖放操作的目标的项

Private Const TV_FIRST = &H1100
Private Const TVM_GETITEMRECT As Long = (TV_FIRST + 4)
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)
Private Const TVM_SELECTITEM As Long = (TV_FIRST + 11)
Private Const TVM_DELETEITEM As Long = (TV_FIRST + 1)
Private Const TVM_GETCOUNT = (TV_FIRST + 5)


Private Const TVM_HITTEST = (TV_FIRST + 17)
Private Const TVM_GETITEM = (TV_FIRST + 12)
Private Const TVM_GETITEMA = (TV_FIRST + 12)
Private Const TVM_GETITEMW = (TV_FIRST + 12)


Private Const TVHT_ONITEMLABEL = &H4
Private Const TVIF_TEXT = &H1
Private Const GMEM_FIXED = &H0
Private Const TVM_EXPAND As Long = &H1102
Private Const WM_SETREDRAW As Long = &HB

Private Const PROCESS_ALL_ACCESS = &H1F0FFF
Private Const MEM_DECOMMIT = &H4000
Private Const MEM_RELEASE = &H8000
Private Const MEM_COMMIT = &H1000
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Const MAX_LVMSTRING As Long = 255
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Type TVITEM
mask As Long
HTreeItem As Long
state As Long
stateMask As Long
pszText As Long
cchTextMax As Long
iImage As Long
iSelectedImage As Long
cChildren As Long
lParam As Long
End Type

Sub test2()
Dim Flag As Long '是否展开
Dim hTreeView As Long 'TreeView 控件句柄
Dim hTVRoot As Long '根节点句柄
Dim hTVItem As Long '子节点句柄

Dim vProcessId As Long
Dim vProcess As Long
Dim vPointer As Long
Dim vItemCount As Long
Dim pMyItemMemory As Long

Dim i As Long
Dim result As Long
Dim bytes As Long
Dim vItem As TVITEM
Dim tmpItem As TVITEM
Dim strBuffer() As Byte
Dim tmpString As String
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ReDim strBuffer(MAX_LVMSTRING)
hTreeView = 1379188 '获得SysTreeView32控件句柄

Call GetWindowThreadProcessId(hTreeView, vProcessId)
vProcess = OpenProcess(PROCESS_ALL_ACCESS, False, vProcessId)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'根节点 / 节点 / 展开
hTVRoot = SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_ROOT, ByVal 0&) '根节点句柄
hTVItem = SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_CHILD, ByVal hTVRoot) '根节点下第一个子节点句柄
'hTVItem = SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_Next, ByVal hTVItem) '根节点下第二个子节点句柄
SendMessage hTreeView, TVM_SELECTITEM, TVGN_Caret, ByVal hTVItem '选中指定节点
Flag = SendMessage(hTreeView, TVM_EXPAND, TVM_EXPAND, ByVal hTVRoot) '展开节点

vPointer = VirtualAllocEx(vProcess, ByVal 0&, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE)

With vItem
.mask = TVIF_TEXT
.HTreeItem = hTVItem
.pszText = vPointer
End With

result = WriteProcessMemory(vProcess, ByVal vPointer, vItem, LenB(vItem), 0)
result = SendMessage(hTreeView, TVM_GETITEMA, False, ByVal vPointer)
result = ReadProcessMemory(vProcess, ByVal vPointer, strBuffer(0), LenB(tmpItem), 0)
tmpString = StrConv(strBuffer, vbUnicode)

Call VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE)
Call CloseHandle(vProcess)

End Sub

...全文
268 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
X615769472 2018-12-18
  • 打赏
  • 举报
回复
有老师能指点一下吗?错误在哪里,如何修改

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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