1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Runtime.InteropServices;
  11. namespace 读取其他软件listview控件的内容
  12. {
  13. public partial class Form1 : Form
  14. {
  15. int hwnd; //窗口句柄
  16. int process;//进程句柄
  17. int pointer;
  18. private const uint LVM_FIRST = 0x1000;
  19. private const uint LVM_GETHEADER = LVM_FIRST + ;
  20. private const uint LVM_GETITEMCOUNT = LVM_FIRST + ;//获取列表行数
  21. private const uint LVM_GETITEMTEXT = LVM_FIRST + ;//获取列表内的内容
  22. private const uint LVM_GETITEMW = LVM_FIRST + ;
  23.  
  24. private const uint HDM_GETITEMCOUNT = 0x1200;//获取列表列数
  25.  
  26. private const uint PROCESS_VM_OPERATION = 0x0008;//允许函数VirtualProtectEx使用此句柄修改进程的虚拟内存
  27. private const uint PROCESS_VM_READ = 0x0010;//允许函数访问权限
  28. private const uint PROCESS_VM_WRITE = 0x0020;//允许函数写入权限
  29.  
  30. private const uint MEM_COMMIT = 0x1000;//为特定的页面区域分配内存中或磁盘的页面文件中的物理存储
  31. private const uint MEM_RELEASE = 0x8000;
  32. private const uint MEM_RESERVE = 0x2000;//保留进程的虚拟地址空间,而不分配任何物理存储
  33.  
  34. private const uint PAGE_READWRITE = ;
  35.  
  36. private int LVIF_TEXT = 0x0001;
  37.  
  38. [DllImport("user32.dll")]//查找窗口
  39. private static extern int FindWindow(
  40. string strClassName, //窗口类名
  41. string strWindowName //窗口标题
  42. );
  43.  
  44. [DllImport("user32.dll")]//在窗口列表中寻找与指定条件相符的第一个子窗口
  45. private static extern int FindWindowEx(
  46. int hwndParent, // handle to parent window
  47. int hwndChildAfter, // handle to child window
  48. string className, //窗口类名
  49. string windowName // 窗口标题
  50. );
  51. [DllImport("user32.DLL")]
  52. private static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
  53. [DllImport("user32.dll")]//找出某个窗口的创建者(线程或进程),返回创建者的标志符
  54. private static extern int GetWindowThreadProcessId(int hwnd, out int processId);
  55. [DllImport("kernel32.dll")]//打开一个已存在的进程对象,并返回进程的句柄
  56. private static extern int OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int processId);
  57. [DllImport("kernel32.dll")]//为指定的进程分配内存地址:成功则返回分配内存的首地址
  58. private static extern int VirtualAllocEx(int hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
  59. [DllImport("kernel32.dll")]//从指定内存中读取字节集数据
  60. private static extern bool ReadProcessMemory(
  61. int hProcess, //被读取者的进程句柄
  62. int lpBaseAddress,//开始读取的内存地址
  63. IntPtr lpBuffer, //数据存储变量
  64. int nSize, //要写入多少字节
  65. ref uint vNumberOfBytesRead//读取长度
  66. );
  67. [DllImport("kernel32.dll")]//将数据写入内存中
  68. private static extern bool WriteProcessMemory(
  69. int hProcess,//由OpenProcess返回的进程句柄
  70. int lpBaseAddress, //要写的内存首地址,再写入之前,此函数将先检查目标地址是否可用,并能容纳待写入的数据
  71. IntPtr lpBuffer, //指向要写的数据的指针
  72. int nSize, //要写入的字节数
  73. ref uint vNumberOfBytesRead
  74. );
  75. [DllImport("kernel32.dll")]
  76. private static extern bool CloseHandle(int handle);
  77. [DllImport("kernel32.dll")]//在其它进程中释放申请的虚拟内存空间
  78. private static extern bool VirtualFreeEx(
  79. int hProcess,//目标进程的句柄,该句柄必须拥有PROCESS_VM_OPERATION的权限
  80. int lpAddress,//指向要释放的虚拟内存空间首地址的指针
  81. uint dwSize,
  82. uint dwFreeType//释放类型
  83. );
  84. /// <summary>
  85. /// LVITEM结构体,是列表视图控件的一个重要的数据结构
  86. /// 占空间:4(int)x7=28个byte
  87. /// </summary>
  88. private struct LVITEM //结构体
  89. {
  90. public int mask;//说明此结构中哪些成员是有效的
  91. public int iItem;//项目的索引值(可以视为行号)从0开始
  92. public int iSubItem; //子项的索引值(可以视为列号)从0开始
  93. public int state;//子项的状态
  94. public int stateMask; //状态有效的屏蔽位
  95. public IntPtr pszText; //主项或子项的名称
  96. public int cchTextMax;//pszText所指向的缓冲区大小
  97. }
  98.  
  99. public Form1()
  100. {
  101. InitializeComponent();
  102. }
  103.  
  104. /// <summary>
  105. /// LV列表总行数
  106. /// </summary>
  107. private int ListView_GetItemRows(int handle)
  108. {
  109. return SendMessage(handle, LVM_GETITEMCOUNT, , );
  110. }
  111. /// <summary>
  112. /// LV列表总列数
  113. /// </summary>
  114. private int ListView_GetItemCols(int handle)
  115. {
  116. return SendMessage(handle, HDM_GETITEMCOUNT, , );
  117. }
  118.  
  119. private void button1_Click(object sender, EventArgs e)
  120. {
  121. int headerhwnd; //listview控件的列头句柄
  122. int rows, cols; //listview控件中的行列数
  123. int processId; //进程pid
  124.  
  125. hwnd = FindWindow("#32770", "Windows 任务管理器");
  126. hwnd = FindWindowEx(hwnd, , "#32770", null);
  127. hwnd = FindWindowEx(hwnd, , "SysListView32", null);//进程界面窗口的句柄,通过SPY获取
  128. //hwnd = 0xC1CC0;
  129. headerhwnd = SendMessage(hwnd, LVM_GETHEADER, , );//listview的列头句柄
  130.  
  131. rows = ListView_GetItemRows(hwnd);//总行数,即进程的数量
  132. cols = ListView_GetItemCols(headerhwnd);//列表列数
  133. //cols = 2;
  134. GetWindowThreadProcessId(hwnd, out processId);
  135.  
  136. //打开并插入进程
  137. process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false, processId);
  138. //申请代码的内存区,返回申请到的虚拟内存首地址
  139. pointer = VirtualAllocEx(process, IntPtr.Zero, , MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
  140. string[,] tempStr;//二维数组
  141. string[] temp = new string[cols];
  142.  
  143. tempStr = GetListViewItmeValue(rows, cols);//将要读取的其他程序中的ListView控件中的文本内容保存到二维数组中
  144.  
  145. listView1.Items.Clear();//清空LV控件信息
  146. //输出数组中保存的其他程序的LV控件信息
  147. for (int i = ; i < rows; i++)
  148. {
  149. for (int j = ; j < cols; j++)
  150. {
  151. temp[j] = tempStr[i, j];
  152. }
  153. ListViewItem lvi = new ListViewItem(temp);
  154. listView1.Items.Add(lvi);
  155. }
  156. }
  157.  
  158. /// <summary>
  159. /// 从内存中读取指定的LV控件的文本内容
  160. /// </summary>
  161. /// <param name="rows">要读取的LV控件的行数</param>
  162. /// <param name="cols">要读取的LV控件的列数</param>
  163. /// <returns>取得的LV控件信息</returns>
  164. private string[,] GetListViewItmeValue(int rows, int cols)
  165. {
  166. string[,] tempStr = new string[rows, cols];//二维数组:保存LV控件的文本信息
  167. for (int i = ; i < rows; i++)
  168. {
  169. for (int j = ; j < cols; j++)
  170. {
  171. byte[] vBuffer = new byte[];//定义一个临时缓冲区
  172. LVITEM[] vItem = new LVITEM[];
  173. vItem[].mask = LVIF_TEXT;//说明pszText是有效的
  174. vItem[].iItem = i; //行号
  175. vItem[].iSubItem = j; //列号
  176. vItem[].cchTextMax = vBuffer.Length;//所能存储的最大的文本为256字节
  177. vItem[].pszText = (IntPtr)((int)pointer + Marshal.SizeOf(typeof(LVITEM)));
  178. uint vNumberOfBytesRead = ;
  179.  
  180. //把数据写到vItem中
  181. //pointer为申请到的内存的首地址
  182. //UnsafeAddrOfPinnedArrayElement:获取指定数组中指定索引处的元素的地址
  183. WriteProcessMemory(process, pointer, Marshal.UnsafeAddrOfPinnedArrayElement(vItem, ), Marshal.SizeOf(typeof(LVITEM)), ref vNumberOfBytesRead);
  184.  
  185. //发送LVM_GETITEMW消息给hwnd,将返回的结果写入pointer指向的内存空间
  186. SendMessage(hwnd, LVM_GETITEMW, i, pointer);
  187.  
  188. //从pointer指向的内存地址开始读取数据,写入缓冲区vBuffer中
  189. ReadProcessMemory(process, ((int)pointer + Marshal.SizeOf(typeof(LVITEM))), Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, ), vBuffer.Length, ref vNumberOfBytesRead);
  190.  
  191. string vText = Encoding.Unicode.GetString(vBuffer, , (int)vNumberOfBytesRead); ;
  192. tempStr[i, j] = vText;
  193. }
  194. }
  195. VirtualFreeEx(process, pointer, , MEM_RELEASE);//在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收
  196. CloseHandle(process);//关闭打开的进程对象
  197. return tempStr;
  198. }
  199.  
  200. }
  201. }

读取其他软件listview控件的内容的更多相关文章

  1. ListView 控件与 内容

    1)由控件获取内容:ListViewItem item = Utilities.GetVisualParent<ListViewItem>(chx); if (item == null) ...

  2. 如何清空android ListView控件的内容

    第一种方法: listView.setAdapter(null); 第二种方法: listAdapter.clear(); listAdapter.notifyDataSetChanged() ; 满 ...

  3. C#跨进程读取listview控件中的数据

    http://www.cnblogs.com/Charltsing/p/slv32.html 欢迎交流:QQ564955427 读取标准的32位listview控件中的数据,网上已经有很多代码了.今天 ...

  4. 【VC版】如何获取其他进程中ListView控件中的内容

    如果需要C#版的,可以看下我之前写的:C#如何获取其他程序ListView控件中的内容 获取其他进程的数据需要使用到以下几个函数: VirtualAllocEx() VirtualFreeEx() W ...

  5. ListView控件--2016年12月9日

    ListView属性 ListView   名称 说明 AccessKey 重写 WebControl.AccessKey 属性. 不支持将此属性设置 ListView 控件.(覆盖 WebContr ...

  6. 《ASP.NET1200例》ListView 控件与DataPager控件的结合<一>

    分页     在前一部分开始时介绍的原 HTML 设计中内含分页和排序,所以根据规范完整实现该网格的任务尚未完成.我们先分页,然后再排序. ListView 控件中的分页通过引入另一个新控件 Data ...

  7. 【VB技巧】VB ListView 控件功能使用详解

    来源:http://lcx.cc/?i=494 ListView控件 在工具箱上击鼠标右键,选择快捷菜单的Components(部件)项,在控件列表中选择Microsoft Windows Commo ...

  8. WP8.1开发中ListView控件加载图列表的简单使用(1)

    我也是刚接触WP编程没几个月,就是在这段时间一直闲着没事,然后又比较喜欢WP这款系统,就学习了WP这方面的开发言语,自学是很困难的,掌握这方面的资料不多,很初级,就是自己在网上找资料学习过程中,看到别 ...

  9. ListView控件使用

    //ListView标头的代码创建方法. ColumnHeader title=new ColumnHeader(); //声明标头,并创建对象. title.Text="标头1名称&quo ...

随机推荐

  1. AVAudioSession 音频会话

     http://blog.csdn.net/kingshuo7/article/details/42588191 这里面总结的不错https://segmentfault.com/a/11900000 ...

  2. Ionic2 rc2 Events 跨界面调用的使用方法及问题解决

    Events:事件注册  在任意一界面注册事件之后可在任意界面根据事件名称进行调用. 首先看一下官方文档的调用方式 import { Events } from 'ionic-angular'; co ...

  3. iOS学习之观察者模式

    观察者模式: 观察者具体应用有两个:通知机制(notification)和KVO(key-value-observing)机制 通知机制: 谁要监听值的变化,谁就注册通知 ,特别要注意,通知的接受者必 ...

  4. 关于JavaEE 开发中web.xml的主要配置及其使用

    web.xml 中的listener. filter.servlet 加载顺序及其详解 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人 ...

  5. NSDateFormatter遇到无法转换的问题

    NSDateFormatter并不是万能的,并不是给出什么字符串都能转遍为NSDate类型,所转换的格式必须必须和你给出的格式想对应 比如说:NSString *dateStr = @"20 ...

  6. 第一章 web应用程序开发原理

    [总结] 1.计算机模式  :主机  哑端计算机模式 优点:速度快  反应快 维护修理方便 数据安全性高 缺点:单台计算机安全操作 应用程序难维护 难以跨出平台 客户端 客户计算机模式 优点:速度快 ...

  7. 【转】Xcode概览:调试应用程序

    原文转自:http://www.cocoachina.com/ios/20141128/10358.html 本文由CocoaChina翻译组成员Creolophus(github主页)翻译自苹果官方 ...

  8. 如何让iOS 保持界面流畅?这些技巧你知道吗

    如何让iOS 保持界面流畅?这些技巧你知道吗   作者:ibireme这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如 ...

  9. linux git 推送空文件夹

    /********************************************************************************* * linux git 推送空文件 ...

  10. python 中locals() 和 globals()

    1.locals() 和 globals() 是python 的内建函数,他们提供了字典的形式访问局部变量和全局变量的方式. 示例代码: def test(arg): a=1 b=2 data_dic ...