VB.net实现从ListView控件中异地获取文本内容源代码

对于一些VB6工程代码来说,需要完成从VB到VB.net的转换,在转换过程中需要注意很多内容,利用VB.net的直接转换功能很少能完全成功,需要我们付出很大的努力。

下面的VB.net代码实现从其他应用程序中的ListView控件中异地获取文本内容,是从VB6的代码中转换而来,包括一些旧类型的转换和数据类型声明的变化。

view plaincopy to clipboardprint?

  1 Option Explicit On    
  2 Module Module1   
  3     Public Structure LV_ITEMA   
  4         Dim mask As Integer  
  5         Dim iItem As Integer  
  6         Dim iSubItem As Integer  
  7         Dim state As Integer  
  8         Dim stateMask As Integer  
  9         Dim pszText As Integer  
 10         Dim cchTextMax As Integer  
 11         Dim iImage As Integer  
 12         Dim lParam As Integer  
 13         Dim iIndent As Integer  
 14     End Structure  
 15     'Constants   
 16     Private Const LVFI_PARAM = 1   
 17     Private Const LVM_FIRST = &H1000   
 18     Private Const LVM_FINDITEM = LVM_FIRST + 13   
 19     Private Const LVM_GETITEMTEXT = LVM_FIRST + 45   
 20     Private Const LVM_SORTITEMS = LVM_FIRST + 48   
 21     Private Const LVM_GETHEADER = LVM_FIRST + 31   
 22     Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)   
 23     Private Const HDM_FIRST = &H1200 '// Header messages   
 24     Private Const HDM_GETITEMCOUNT = (HDM_FIRST + 0)   
 25     Private Const HDM_ORDERTOINDEX = (HDM_FIRST + 15)   
 26     Private Const PROCESS_QUERY_INFORMATION = 1024   
 27     Private Const PROCESS_VM_OPERATION = &H8   
 28     Private Const PROCESS_VM_READ = &H10   
 29     Private Const PROCESS_VM_WRITE = &H20   
 30     Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF   
 31     Private Const STANDARD_RIGHTS_REQUIRED = &HF0000   
 32     Private Const MAX_LVMSTRING As Integer = 255 '可根椐读取数据长度设置适当的数值   
 33     Private Const MEM_COMMIT = &H1000   
 34     Private Const MEM_RELEASE = &H8000   
 35     Private Const PAGE_READWRITE = &H4   
 36     Private Const LVIF_TEXT As Integer = &H1   
 37     'API declarations   
 38     Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As IntegerAs Integer  
 39     Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Byte, ByVal nSize As Integer, ByVal lpNumberOfBytesWritten As IntegerAs Integer  
 40     Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Integer, ByVal lpAddress As Integer, ByVal dwSize As Integer, ByVal dwFreeType As IntegerAs Integer  
 41     Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As LV_ITEMA, ByVal nSize As Integer, ByVal lpNumberOfBytesWritten As IntegerAs Integer  
 42     Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Integer, ByVal lpAddress As Integer, ByVal dwSize As Integer, ByVal flAllocationType As Integer, ByVal flProtect As IntegerAs Integer  
 43     Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcId As IntegerAs Integer  
 44     Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Integer, ByRef lpdwProcessId As IntegerAs Integer  
 45     Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As IntegerAs Integer  
 46     Public Function GetListviewItem(ByVal hWindow As Integer, ByVal ProcessID As Integer, ByVal pColumn As Integer, ByVal pRow As IntegerAs String  
 47         Dim Result As Integer  
 48         Dim myItem As LV_ITEMA   
 49         Dim pHandle As Integer  
 50         Dim pStrBufferMemory As Integer  
 51         Dim pMyItemMemory As Integer  
 52         Dim strBuffer() As Byte  
 53         Dim Index As Integer  
 54         Dim tmpString As String  
 55         Dim strLength As Integer  
 56         '******************************   
 57         '为动态数组变量重新分配存储空间   
 58         '******************************   
 59         ReDim strBuffer(MAX_LVMSTRING)   
 60         '*****************************************************************************************************   
 61         '打开一个现有进程的句柄,返回值Long,如执行成功,返回进程句柄;零表示失败。会设置GetLastError   
 62         'Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long   
 63         '参数 类型及说明   
 64         'dwDesiredAccess Long,指定这个句柄要求的访问方法。指定API32.TXT文件中以PROCESS_???开头的一个或多个常数   
 65         'bInheritHandle Long,如句柄能够由子进程继承,则为TRUE   
 66         'dwProcessId Long,要打开那个进程的进程标识符   
 67         '*****************************************************************************************************   
 68         pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID)   
 69         '*****************************************************************************************************   
 70         'VirtualAllocEx(目标进程的句柄,0,内存区域的大小,分配类型,新分配内存的存取保护类型) 返回所分配页面的基址   
 71         '*****************************************************************************************************   
 72         pStrBufferMemory = VirtualAllocEx(pHandle, 0, MAX_LVMSTRING, MEM_COMMIT, PAGE_READWRITE)   
 73         '*************************************************   
 74         '初始化LV_ITEM 结构   
 75         'MyItem.iSubItem 列的索引号   
 76         'myItem.pszText 数据内容(此处是一个分配的内存地址)   
 77         '*************************************************   
 78         myItem.mask = LVIF_TEXT   
 79         myItem.iSubItem = pColumn   
 80         myItem.pszText = pStrBufferMemory   
 81         myItem.cchTextMax = MAX_LVMSTRING   
 82         '***********************************************************   
 83         '把这个结构写入远程进程process's 存储量   
 84         'WriteProcessMemory(目标进程的句柄,地址,写入的数据,字节数,0)   
 85         '***********************************************************   
 86         pMyItemMemory = VirtualAllocEx(pHandle, 0Len(myItem), MEM_COMMIT, PAGE_READWRITE)   
 87         Result = WriteProcessMemory(pHandle, pMyItemMemory, (myItem), Len(myItem), 0&)   
 88         '********************************   
 89         '发送消息,得到项目信息和写入内存   
 90         '********************************   
 91         strLength = SendMessage(hWindow, LVM_GETITEMTEXT, pRow, pMyItemMemory)   
 92         Result = ReadProcessMemory(pHandle, pStrBufferMemory, strBuffer(0), MAX_LVMSTRING, 0)   
 93         tmpString = System.Text.Encoding.Default.GetString(strBuffer).Trim   
 94         Result = ReadProcessMemory(pHandle, pMyItemMemory, myItem, Len(myItem), 0)   
 95         '****************************   
 96         '释放分配的内存和关闭进程句柄   
 97         '****************************   
 98         Result = VirtualFreeEx(pHandle, pStrBufferMemory, 0, MEM_RELEASE)   
 99         Result = VirtualFreeEx(pHandle, pMyItemMemory, 0, MEM_RELEASE)   
100         Result = CloseHandle(pHandle)   
101         If Len(tmpString) > 0 Then GetListviewItem = tmpString   
102     End Function  
103 End Module  
104 Option Explicit On 
105 Module Module1
106     Public Structure LV_ITEMA
107         Dim mask As Integer
108         Dim iItem As Integer
109         Dim iSubItem As Integer
110         Dim state As Integer
111         Dim stateMask As Integer
112         Dim pszText As Integer
113         Dim cchTextMax As Integer
114         Dim iImage As Integer
115         Dim lParam As Integer
116         Dim iIndent As Integer
117     End Structure
118     'Constants
119     Private Const LVFI_PARAM = 1
120     Private Const LVM_FIRST = &H1000
121     Private Const LVM_FINDITEM = LVM_FIRST + 13
122     Private Const LVM_GETITEMTEXT = LVM_FIRST + 45
123     Private Const LVM_SORTITEMS = LVM_FIRST + 48
124     Private Const LVM_GETHEADER = LVM_FIRST + 31
125     Private Const LVM_GETITEMCOUNT = (LVM_FIRST + 4)
126     Private Const HDM_FIRST = &H1200 '// Header messages
127     Private Const HDM_GETITEMCOUNT = (HDM_FIRST + 0)
128     Private Const HDM_ORDERTOINDEX = (HDM_FIRST + 15)
129     Private Const PROCESS_QUERY_INFORMATION = 1024
130     Private Const PROCESS_VM_OPERATION = &H8
131     Private Const PROCESS_VM_READ = &H10
132     Private Const PROCESS_VM_WRITE = &H20
133     Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
134     Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
135     Private Const MAX_LVMSTRING As Integer = 255 '可根椐读取数据长度设置适当的数值
136     Private Const MEM_COMMIT = &H1000
137     Private Const MEM_RELEASE = &H8000
138     Private Const PAGE_READWRITE = &H4
139     Private Const LVIF_TEXT As Integer = &H1
140     'API declarations
141     Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As IntegerAs Integer
142     Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Byte, ByVal nSize As Integer, ByVal lpNumberOfBytesWritten As IntegerAs Integer
143     Private Declare Function VirtualFreeEx Lib "kernel32" (ByVal hProcess As Integer, ByVal lpAddress As Integer, ByVal dwSize As Integer, ByVal dwFreeType As IntegerAs Integer
144     Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As LV_ITEMA, ByVal nSize As Integer, ByVal lpNumberOfBytesWritten As IntegerAs Integer
145     Private Declare Function VirtualAllocEx Lib "kernel32" (ByVal hProcess As Integer, ByVal lpAddress As Integer, ByVal dwSize As Integer, ByVal flAllocationType As Integer, ByVal flProtect As IntegerAs Integer
146     Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcId As IntegerAs Integer
147     Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Integer, ByRef lpdwProcessId As IntegerAs Integer
148     Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As IntegerAs Integer
149     Public Function GetListviewItem(ByVal hWindow As Integer, ByVal ProcessID As Integer, ByVal pColumn As Integer, ByVal pRow As IntegerAs String
150         Dim Result As Integer
151         Dim myItem As LV_ITEMA
152         Dim pHandle As Integer
153         Dim pStrBufferMemory As Integer
154         Dim pMyItemMemory As Integer
155         Dim strBuffer() As Byte
156         Dim Index As Integer
157         Dim tmpString As String
158         Dim strLength As Integer
159         '******************************
160         '为动态数组变量重新分配存储空间
161         '******************************
162         ReDim strBuffer(MAX_LVMSTRING)
163         '*****************************************************************************************************
164         '打开一个现有进程的句柄,返回值Long,如执行成功,返回进程句柄;零表示失败。会设置GetLastError
165         'Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
166         '参数 类型及说明
167         'dwDesiredAccess Long,指定这个句柄要求的访问方法。指定API32.TXT文件中以PROCESS_???开头的一个或多个常数
168         'bInheritHandle Long,如句柄能够由子进程继承,则为TRUE
169         'dwProcessId Long,要打开那个进程的进程标识符
170         '*****************************************************************************************************
171         pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID)
172         '*****************************************************************************************************
173         'VirtualAllocEx(目标进程的句柄,0,内存区域的大小,分配类型,新分配内存的存取保护类型) 返回所分配页面的基址
174         '*****************************************************************************************************
175         pStrBufferMemory = VirtualAllocEx(pHandle, 0, MAX_LVMSTRING, MEM_COMMIT, PAGE_READWRITE)
176         '*************************************************
177         '初始化LV_ITEM 结构
178         'MyItem.iSubItem 列的索引号
179         'myItem.pszText 数据内容(此处是一个分配的内存地址)
180         '*************************************************
181         myItem.mask = LVIF_TEXT
182         myItem.iSubItem = pColumn
183         myItem.pszText = pStrBufferMemory
184         myItem.cchTextMax = MAX_LVMSTRING
185         '***********************************************************
186         '把这个结构写入远程进程process's 存储量
187         'WriteProcessMemory(目标进程的句柄,地址,写入的数据,字节数,0)
188         '***********************************************************
189         pMyItemMemory = VirtualAllocEx(pHandle, 0Len(myItem), MEM_COMMIT, PAGE_READWRITE)
190         Result = WriteProcessMemory(pHandle, pMyItemMemory, (myItem), Len(myItem), 0&)
191         '********************************
192         '发送消息,得到项目信息和写入内存
193         '********************************
194         strLength = SendMessage(hWindow, LVM_GETITEMTEXT, pRow, pMyItemMemory)
195         Result = ReadProcessMemory(pHandle, pStrBufferMemory, strBuffer(0), MAX_LVMSTRING, 0)
196         tmpString = System.Text.Encoding.Default.GetString(strBuffer).Trim
197         Result = ReadProcessMemory(pHandle, pMyItemMemory, myItem, Len(myItem), 0)
198         '****************************
199         '释放分配的内存和关闭进程句柄
200         '****************************
201         Result = VirtualFreeEx(pHandle, pStrBufferMemory, 0, MEM_RELEASE)
202         Result = VirtualFreeEx(pHandle, pMyItemMemory, 0, MEM_RELEASE)
203         Result = CloseHandle(pHandle)
204         If Len(tmpString) > 0 Then GetListviewItem = tmpString
205     End Function
206 End Module

 

 

实现转换的过程其实就是一个按图索骥的过程,按照VB.net丰富的运行错误信息提示,一步步的来完成。

 

 

posted @ 2010-01-06 22:43  clown  阅读(1768)  评论(0编辑  收藏  举报