4.3、读取其他软件listview控件的内容

4.3.0、根据窗口句柄,获取进程Id,打开并插入进程,申请代码的内存区,返回申请到的虚拟内存首地址
        Dim processId As Integer 
        '进程pid   
        hwnd = FindWindow("#32770", "Windows 任务管理器")       '获取任务管理器窗口句柄,注释By Lyh 
        hwnd = FindWindowEx(hwnd, 0, "#32770", Nothing)         '获取选项卡窗口句柄,注释By Lyh 
        hwnd = FindWindowEx(hwnd, 0, "SysListView32", Nothing)  '获取进程列表框ListView窗口句柄,注释By Lyh

headerhwnd = SendMessage(hwnd, LVM_GETHEADER, 0, 0) 
        'listview的列头句柄 
        rows =SendMessage(hwnd, LVM_GETITEMCOUNT, 0, 0) 
        '总行数,即进程的数量 
        cols = SendMessage(headerhwnd, HDM_GETITEMCOUNT, 0, 0) 
        '列表列数

'根据窗口句柄,获取进程Id 
        GetWindowThreadProcessId(hwnd, processId) 
        
        '打开并插入进程 
        process = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, processId) 
        '申请代码的内存区,返回申请到的虚拟内存首地址 
        pointer = VirtualAllocEx(process, IntPtr.Zero, 4096, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE) 
         '获取ListView样式 
        If (SendMessage(hwnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) And LVS_EX_CHECKBOXES = LVS_EX_CHECKBOXES) Then             
             '返回'任务管理器--进程返回,应用程序返回 
            'ListView 带检查框 
        End If 
     .............调用后边相关函数与过程,实现相应功能,以下为示例代码.............
        Dim tempHead As String() = New String(cols - 1) {} 
        tempHead = GetListViewHead(cols) 
        ListView1.Columns.Clear() 
        For j As Integer = 0 To cols - 1 
            ListView1.Columns.Add(tempHead(j)) 
        Next 
        
        Dim tempStr As String(,) 
        '二维数组 
        Dim temp As String() = New String(cols - 1) {} 
        tempStr = GetListViewItmeValue(rows, cols) 
        '将要读取的其他程序中的ListView控件中的文本内容保存到二维数组中 
        ListView1.Items.Clear()

'清空LV控件信息 
        '输出数组中保存的其他程序的LV控件信息 
        For i As Integer = 0 To rows - 1 
            For j As Integer = 0 To cols - 1 
                temp(j) = tempStr(i, j) 
            Next 
            Dim lvi As New ListViewItem(temp) 
            ListView1.Items.Add(lvi) 
        Next 
        .............示例代码.............

      VirtualFreeEx(process, pointer, 0, MEM_RELEASE) 
        '在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收 
        CloseHandle(process) 
        '关闭打开的进程对象 
 
4.3.1、获取ListView表头 
    Private Function GetListViewHead(ByVal cols As Integer) As String() 
        Dim tempStr As String() = New String(cols - 1) {} 
        '一维数组:保存LVHead控件的文本信息 
        Dim vBuffer As Byte() = New Byte(255) {} 
        '定义一个临时缓冲区 
        Dim vItem As HDITEM = New HDITEM

vItem.mask = HDI_TEXT

vItem.cchTextMax = vBuffer.Length 
        '所能存储的最大的文本为字节

vItem.pszText = New IntPtr(CInt(pointer) + Marshal.SizeOf(GetType(HDITEM))) 'tmpptr 'DirectCast(CInt(pointer) + Marshal.SizeOf(GetType(HDITEM)), IntPtr) 
        Dim vNumberOfBytesRead As UInteger = 0

'把数据写到vItem中 
        'pointer为申请到的内存的首地址 
        Dim ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vItem)) '也可以像GetListViewItmeValue定义一个只有个元素的维数组,以方便的通过UnsafeAddrOfPinnedArrayElement获取地址,就不知道哪个效率更高。 
        Marshal.StructureToPtr(vItem, ptr, True) 
        WriteProcessMemory(process, pointer, ptr, Marshal.SizeOf(GetType(HDITEM)), vNumberOfBytesRead)

For j As Integer = 0 To cols - 1 
            '发送HDM_GETITEM消息给headerhwnd,将返回的结果写入pointer指向的内存空间 
            SendMessage(headerhwnd, HDM_GETITEM, j, pointer)

'从pointer指向的内存地址开始读取数据,写入缓冲区vBuffer中 
            ReadProcessMemory(process, (CInt(pointer) + Marshal.SizeOf(GetType(HDITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, vNumberOfBytesRead)

tempStr(j) = Encoding.Unicode.GetString(vBuffer, 0, CInt(vNumberOfBytesRead)) 
        Next

'VirtualFreeEx(process, pointer, 0, MEM_RELEASE)   '最后才调用,因为程序别的部分还需要用到。 
        '在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收 
        'CloseHandle(process)                              '最后才调用,因为程序别的部分还需要用到。 
        '关闭打开的进程对象

Return tempStr 
    End Function 
  
  4.3.2、 从内存中读取指定的LV控件的文本内容 
以下读取listview内容的代码参考自并作了修改:
C#如何获取其他程序ListView控件中的内容http://www.cnblogs.com/hongfei/archive/2012/12/24/2829799.html
也可参考:参考《向其他程序的ListView控件发送LVM_GETITEMTEXT》
    ''' </summary> 
    ''' <param name="rows">要读取的LV控件的行数</param> 
    ''' <param name="cols">要读取的LV控件的列数</param> 
    ''' <returns>取得的LV控件信息</returns> 
    Private Function GetListViewItmeValue(ByVal rows As Integer, ByVal cols As Integer) As String(,)

Dim tempStr As String(,) = New String(rows - 1, cols - 1) {} 
        '二维数组:保存LV控件的文本信息

Dim vBuffer As Byte() = New Byte(255) {} 
        '定义一个临时缓冲区

Dim vItem As LVITEM() = New LVITEM(0) {}    '定义个只有个元素的维数组,是为了方便通过UnsafeAddrOfPinnedArrayElement获得地址。 
        vItem(0).mask = LVIF_TEXT 'Or LVIF_STATE 'Or LVIF_PARAM 'Or LVIF_IMAGE ' 
        '说明pszText是有效的 
        vItem(0).cchTextMax = vBuffer.Length 
        '所能存储的最大的文本为字节 
        Dim vNumberOfBytesRead As UInteger = 0 
        vItem(0).pszText = New IntPtr(CInt(pointer) + Marshal.SizeOf(GetType(LVITEM))) 'tmpptr 'DirectCast(CInt(pointer) + Marshal.SizeOf(GetType(LVITEM)), IntPtr)

For i As Integer = 0 To rows - 1 
            vItem(0).iItem = i 
            '行号 
            For j As Integer = 0 To cols - 1

vItem(0).iSubItem = j

'把数据写到vItem中 
                'pointer为申请到的内存的首地址 
                'UnsafeAddrOfPinnedArrayElement:获取指定数组中指定索引处的元素的地址 
                WriteProcessMemory(process, pointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(GetType(LVITEM)), vNumberOfBytesRead)

'发送LVM_GETITEMW消息给hwnd,将返回的结果写入pointer指向的内存空间 
                SendMessage(hwnd, LVM_GETITEMW, i, pointer) 
                '从pointer指向的内存地址开始读取数据,写入缓冲区vBuffer中 
                ReadProcessMemory(process, (CInt(pointer) + Marshal.SizeOf(GetType(LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), vBuffer.Length, vNumberOfBytesRead)

tempStr(i, j) = Encoding.Unicode.GetString(vBuffer, 0, CInt(vNumberOfBytesRead)) 
                
            Next 
        Next 
        'VirtualFreeEx(process, pointer, 0, MEM_RELEASE) 
        '在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收 
        'CloseHandle(process) 
        '关闭打开的进程对象 
        Return tempStr 
    End Function

4.3.3、获取ListView样式 
'获取ListView样式 
        If (SendMessage(hwnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) And LVS_EX_CHECKBOXES = LVS_EX_CHECKBOXES) Then              '返回'任务管理器--进程返回,应用程序返回 
            MsgBox("ListView 带检查框") 
        Else 
            MsgBox("不带检查框") 
        End If 
4.3.4、读取ListView中Checkbox是否Checked
 '读取ListView中Checkbox是否Checked,第三个参数为行。通过第四个参数,获取不同的ITEMSTATE值,例如,LVIS_SELECTED获取是否该行被选中。 
        If (SendMessage(hwnd, LVM_GETITEMSTATE, 1, LVIS_STATEIMAGEMASK) = 2 << 12) Then 
            MsgBox("Checked") 
        Else 
            MsgBox("UnCheck") 
        End If 
4.3.5、设置checkbox值 
'设置checkbox 
    '在commctrl.h中的相关定义: 
    '#define INDEXTOSTATEIMAGEMASK(i) ((i) << 12)       ’表示i往左移位次,VB.NET也有该运算符。 
    '#define ListView_SetCheckState(hwndLV, i, fCheck) \ 
    '   ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), LVIS_STATEIMAGEMASK) 
    '#endif 
    '说明:INDEXTOSTATEIMAGEMASK((fCheck)?2:1) 为或左移位次,结果即为:&H2000(checkbox选中)及&H1000(checkbox不选中) 
    '#define ListView_SetItemState(hwndLV, i, data, mask) \ 
    '{ LV_ITEM _ms_lvi;\ 
    '  _ms_lvi.stateMask = mask;\ 
    '  _ms_lvi.state = data;\ 
    '  SNDMSG((hwndLV), LVM_SETITEMSTATE, (WPARAM)i, (LPARAM)(LV_ITEM FAR *)&_ms_lvi);\ ‘最后一个参数,只需理解为1个指针就好,不必理会那么多
    '} 
    '这个宏定义的意思:传递一个LV_ITEM 结构变量指针,只需设置结构中的stateMask、state为需要的值。

Private Sub SetListViewItmeCheck(ByVal rows As Integer)

Dim vBuffer As Byte() = New Byte(255) {} 
        '定义一个临时缓冲区

Dim vItem As LVITEM() = New LVITEM(0) {} 
  vItem(0).state = &H2000 'Checked:2<<12 即是&H2000                ’设置值为LVIS_SELECTED 则可以选中该行 
        vItem(0).stateMask = LVIS_STATEIMAGEMASK ' LVIS_STATEIMAGEMASK      ’设置值为LVIS_SELECTED 则可以选中该行 
        Dim vNumberOfBytesRead As UInteger = 0

'把数据写到vItem中 
        'pointer为申请到的内存的首地址 
        'UnsafeAddrOfPinnedArrayElement:获取指定数组中指定索引处的元素的地址 
        WriteProcessMemory(process, pointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(GetType(LVITEM)), vNumberOfBytesRead)

'发送LVM_SETITEMSTATE消息给hwnd,进程从pointer指向的内存空间传递参数,如果只需传递简单的参数,则不需要前面那么多复杂的代码,只需发出下面代码即可。 
        SendMessage(hwnd, LVM_SETITEMSTATE, rows, pointer)

'VirtualFreeEx(process, pointer, 0, MEM_RELEASE) 
        '在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收 
        'CloseHandle(process) 
        '关闭打开的进程对象 
    End Sub 
4.3.6、设置ListVIew控件的文本内容
   Private Function SetListViewItmeValue(ByVal rows As Integer, ByVal cols As Integer, ByVal ItmeValue As String) As Integer

Dim vBuffer As Byte() = New Byte(255) {} 
        '定义一个临时缓冲区

Dim vItem As LVITEM() = New LVITEM(0) {}    '定义个只有个元素的维数组,是为了方便通过UnsafeAddrOfPinnedArrayElement获得地址。 
        vItem(0).mask = LVIF_TEXT 'Or LVIF_STATE 'Or LVIF_PARAM 'Or LVIF_IMAGE ' 
        '说明pszText是有效的 
        vItem(0).cchTextMax = vBuffer.Length 
        '所能存储的最大的文本为字节 
        Dim vNumberOfBytesRead As UInteger = 0

vItem(0).pszText = New IntPtr(CInt(pointer) + Marshal.SizeOf(GetType(LVITEM))) 'tmpptr 'DirectCast(CInt(pointer) + Marshal.SizeOf(GetType(LVITEM)), IntPtr) 
        '上面这行,可以用如下形式代码代替。 
     ' 参考《向其他程序的ListView控件发送LVM_GETITEMTEXT》中的LVM_SETITEMTEXT部分
   'http://wenku.baidu.com/link?url=BD0hEOPJYYDcgvaG9qrXflpA-ViRnfmlKp6Vo8Z5zTiyDBFSGuCzcCNc_gZ_oxtmMk9s3CJZLDmcv8zfd9wKCXjeZBpWWC1D3C_pbbF0FQ3 
        'Dim MypszText As IntPtr = VirtualAllocEx(process, IntPtr.Zero, 256, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE) 
        'vItem(0).pszText = MypszText 
        'WriteProcessMemory(process, MypszText, Marshal.StringToHGlobalAuto(ItmeValue), ItmeValue.Length * 2, vNumberOfBytesRead)

vItem(0).iItem = rows 
        '行号

vItem(0).iSubItem = cols

''将数据ItmeValue写入vItem的pszText中(StringToHGlobalAuto引用不同的字符串到指针,结果不一样) 
        '以及把数据写到vItem中,顺序可互换 
        'pointer为申请到的内存的首地址 
        'UnsafeAddrOfPinnedArrayElement:获取指定数组中指定索引处的元素的地址 
        WriteProcessMemory(process, (CInt(pointer) + Marshal.SizeOf(GetType(LVITEM))), Marshal.StringToHGlobalAuto(ItmeValue), ItmeValue.Length * 2, vNumberOfBytesRead) 
        WriteProcessMemory(process, pointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), Marshal.SizeOf(GetType(LVITEM)), vNumberOfBytesRead)

'发送LVM_SETITEMTEXT消息给hwnd,进程从pointer指向的内存空间传递参数,如果只需传递简单的参数,则不需要前面那么多复杂的代码,只需发出下面代码即可。 
        SendMessage(hwnd, LVM_SETITEMTEXT, rows, pointer) 
        
        'VirtualFreeEx(process, MypszText, 0, MEM_RELEASE) 
        'VirtualFreeEx(process, pointer, 0, MEM_RELEASE) 
        '在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收 
        'CloseHandle(process) 
        '关闭打开的进程对象

End Function

转载于:https://www.cnblogs.com/lefour/p/5464114.html

VB.NET自动操作其他程序(4)--读取、设置其他软件listview控件的内容相关推荐

  1. VB 单击ListView控件某列表头进行排序

    VB 单击ListView控件某列表头进行排序,实现方法比较简单,不用写什么函数,ListView控件本身就有排序功能了. Private Sub ListView1_ColumnClick(ByVa ...

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

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

  3. 《如何更改其他程序ListView控件中某个Item的内容》

    <如何更改其他程序ListView控件中某个Item的内容> 天津 赵春生 ××× 一:程序说明: 这次我将介绍如何更改其他程序ListView控件中某个Item的内容,关于类似的拙文我已 ...

  4. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)...

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

  5. html设置字体facename,CRichEdit控件操作使用

    一般性问题 1.    代码编译通过了,运行后RichEdit控件不显示,在InitInstance中添加 BOOL CWinApp::InitInstance () { - AfxInitRichE ...

  6. VB.NET中LISTVIEW控件点击列首排序问题

    最近写的程序需要点击LISTVIEW控件的列首排序,搜索了一下网上的文章代码,很少,而且是C#的代码,看了下MSDN,终于搞清楚了VB的写法,MSDN上只有按照字母顺序排序的,于是我加工了一下,可以选 ...

  7. vs2015+opencv3.2+mfc读取摄像头显示在图片控件Picture Control

    vs2015 + opencv3.3 + mfc读取摄像头显示在图片控件Picture Control 要开始做一个行人检测的小项目,首先读取出摄像头显示,参考了这位博主的教程:http : //bl ...

  8. CEdit 控件 更新内容的 方法(可以自动滚动至末尾)

    CEdit 控件更新内容大概有如下几种方法: 1.关联CString变量.先改变CString变量的值,然后调用UpDateData(FALSE)来更新控件.如果需要滚动至末尾一行,可以调用 [cpp ...

  9. C++ 一个程序获取另一个程序Edit控件的内容

    转载地址:https://www.cnblogs.com/lujin49/p/4796502.html //一个程序获取另一个程序Edit控件的内容 //根据指定程序的标题名获取改程序窗口的句柄 HW ...

  10. vb实现webbrowser显示html,VB.NET 通过窗口句柄,获取webbrowser控件HTML内容

    VB.NET通过窗口句柄,获取webbrowser控件HTML内容 通过Sendmessage获取IE浏览器内容 webbrowser控件内容获取 Class Win32API     _ Publi ...

最新文章

  1. Rhythmk 学习 Hibernate 08 - Hibernate annotation 关联关系注解
  2. Redis Sentinel 配置文件
  3. Oracle常用存储过程写法
  4. MySql中 DELIMITER
  5. 几时几分几秒怎么写_头总是一阵一阵眩晕是怎么回事?眩晕症该如何治疗?
  6. emacs文件/目录比较工具
  7. 《信息安全系统设计基础》第六周学习总结
  8. 一建机电实务教材电子版_一建案例学不透?新版一建机电案例一本通,6大模板案例高清讲解...
  9. IT要发掘有价值应用
  10. gitlab 账号注册及修改资料
  11. 基金,最适合普遍投资者的工具
  12. 微服务--应对每秒上万并发下的参数优化实战(实战经验)
  13. pytorch中repeat()函数理解
  14. paperpass查重
  15. PHP实现将网页转为图片:html-pdf-png
  16. 大学最后一个学习的半年,Do crazily without hesitation
  17. 详解WPF 4 DataGrid控件的基本功能
  18. controll层跳转页面_Spring mvc框架 controller间跳转 ,重定向 ,传参
  19. CStdioFile 在文件末尾追加内容
  20. 计算机专业一建考试最好报什么科目,【2018年一级建造师考试科目选择哪个专业好?】- 环球网校...

热门文章

  1. 情人节,给你们发点福利。
  2. python主线程执行回调函数_Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程...
  3. android怎么截取接口返回html代码中的内容_某神秘公司 RESTful、共用接口、前后端分离、接口约定的实践...
  4. shell基础之EOF的用法
  5. Java数据结构和算法 - 堆
  6. Poj2826 An Easy Problem
  7. [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!(续)...
  8. iphone 推送服务--Apple Push Notification Service
  9. spring学习笔记整理--03(Spring的三种实例化Bean的方式)
  10. iOS “项目名” has conflicting provisioning settings.