用vb.net如何通过Windows API获得另一个程序的tree view控件的tree node文本?
首先我可以得到这个tree node的柄hItem,然后再试图得到它的文本,代码如下:
Dim hProc, lpExternText, lpExternTVITEM, lpText, lpTVITEM As IntPtr
idProc = GetProcessID(目标进程的名字)
hProc = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, idProc)
' 在目标进程的内存中写入一个全是空格的字符串,用来保存后面的消息产生的节点文本
Dim strText As String = " "
lpText = Marshal.StringToHGlobalAnsi(strText)
nSizeText = strText.Length * Marshal.SizeOf("a"c)
lpExternText = VirtualAllocEx(hProc, IntPtr.Zero, nSizeText, MEM_COMMIT, PAGE_READWRITE)
nResult = WriteProcessMemory(hProc, lpExternText, lpText, nSizeText, 0&)
' 在目标进程的内存中写入一个TVITEM结构
Dim tvit As TVITEM
tvit.mask = TVIF_TEXT
tvit.hItem = hItem ‘ hItem是我要获得文本的节点的柄,类型是intptr
tvit.pszText = lpExternText
tvit.cchTextMax = nSizeText
Dim nSizeTVITEM As Integer = Marshal.SizeOf(tvit)
lpExternTVITEM = VirtualAllocEx(hProc, IntPtr.Zero, nSizeTVITEM, MEM_COMMIT, PAGE_READWRITE)
lpTVITEM = Marshal.AllocHGlobal(nSizeTVITEM)
Marshal.StructureToPtr(tvit, lpTVITEM, True)
nResult = WriteProcessMemory(hProc, lpExternTVITEM, lpTVITEM, nSizeTVITEM, 0&)
' 发送Windows message,获得tree node数据,hctrl是目标tree view控件的柄
nResult = SendMessage(hCtrl, TVM_GETITEMA, 0, lpExternTVITEM)
' 从目标程序的内存中读取文本
nResult = ReadProcessMemory(hProc, lpExternText, lpText, nSizeText, 0&)
strText = Marshal.PtrToStringAnsi(lpText)
’ 释放资源
VirtualFreeEx(hProc, lpExternText, 0, MEM_RELEASE)
VirtualFreeEx(hProc, lpExternTVITEM, 0, MEM_RELEASE)
Marshal.FreeHGlobal(lpText)
Marshal.FreeHGlobal(lpTVITEM)
CloseHandle(hProc)
这个代码在32位系统中运行的很好,但到了64位系统就不灵,我知道可能是数据类型不匹配,但不知道具体问题在哪里,请明眼人指点。
顺便问一下,有没有更简便的方法来获取外部程序tree view控件的文本?非常感谢!