用vb.net如何通过Windows API获得另一个程序的tree view控件的tree node文本?

mariowjf 2008-05-28 03:11:17
首先我可以得到这个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控件的文本?非常感谢!
...全文
167 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanlongwuhui 2008-05-29
  • 打赏
  • 举报
回复
没用过64位系统,你查下资料,看是否API的声明有差异
why_aircraft 2008-05-29
  • 打赏
  • 举报
回复
我不知道,不过帮你顶.
只在此山中 2008-05-29
  • 打赏
  • 举报
回复
如果是数据类型问题,估计把如Dim nSizeTVITEM As Integer = Marshal.SizeOf(tvit)
的integer改为int32用就行了.
只在此山中 2008-05-29
  • 打赏
  • 举报
回复
原理都是用这个代码的,估计不是数据类型的问题,可能是内存分配或ansi与unicode问题,你看看错误在那一行.

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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