zoukankan      html  css  js  c++  java
  • 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丰富的运行错误信息提示,一步步的来完成。

  • 相关阅读:
    浏览器开发者工具----F12 功能介绍
    python 爬虫之beautifulsoup(bs4)使用 --待完善
    python 爬虫之beautifulsoup(bs4)环境准备
    python dic字典使用
    python list的使用
    python 实现进制转换(二进制转十进制)
    字符串str的使用方法
    python 第一课 helloworld
    python 学习地址
    React中setState 什么时候是同步的,什么时候是异步的?
  • 原文地址:https://www.cnblogs.com/xxaxx/p/1640786.html
Copyright © 2011-2022 走看看