listview

 
using System.Runtime.InteropServices; 
  
 public const uint LVM_FIRST = 0x1000; 
 public const uint LVM_GETITEMCOUNT = LVM_FIRST + 4; 
 public const uint LVM_GETITEMW = LVM_FIRST + 75; 
  
 [DllImport("user32.DLL")] 
 public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 
 [DllImport("user32.DLL")] 
 public static extern IntPtr FindWindow(string lpszClass, string lpszWindow); 
 [DllImport("user32.DLL")] 
 public static extern IntPtr FindWindowEx(IntPtr hwndParent, 
     IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 
 [DllImport("user32.dll")] 
 public static extern uint GetWindowThreadProcessId(IntPtr hWnd, 
     out uint dwProcessId); 
  
 public const uint PROCESS_VM_OPERATION = 0x0008; 
 public const uint PROCESS_VM_READ = 0x0010; 
 public const uint PROCESS_VM_WRITE = 0x0020; 
  
 [DllImport("kernel32.dll")] 
 public static extern IntPtr OpenProcess(uint dwDesiredAccess, 
     bool bInheritHandle, uint dwProcessId); 
 public const uint MEM_COMMIT = 0x1000; 
 public const uint MEM_RELEASE = 0x8000; 
  
 public const uint MEM_RESERVE = 0x2000; 
 public const uint PAGE_READWRITE = 4; 
  
 [DllImport("kernel32.dll")] 
 public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, 
     uint dwSize, uint flAllocationType, uint flProtect); 
  
 [DllImport("kernel32.dll")] 
 public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, 
    uint dwSize, uint dwFreeType); 
  
 [DllImport("kernel32.dll")] 
 public static extern bool CloseHandle(IntPtr handle); 
  
 [DllImport("kernel32.dll")] 
 public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, 
    IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead); 
  
 [DllImport("kernel32.dll")] 
 public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, 
    IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead); 
  
 public struct LVITEM 
 { 
     public int mask; 
     public int iItem; 
     public int iSubItem; 
     public int state; 
     public int stateMask; 
     public IntPtr pszText; // string 
     public int cchTextMax; 
     public int iImage; 
     public IntPtr lParam; 
     public int iIndent; 
     public int iGroupId; 
     public int cColumns; 
     public IntPtr puColumns; 
 } 
 public int LVIF_TEXT = 0x0001; 
  
 public int ListView_GetItemCount(IntPtr AHandle) 
 { 
     return SendMessage(AHandle, LVM_GETITEMCOUNT, 0, 0); 
 } 
  
 private void button1_Click(object sender, EventArgs e) 
 { 
     IntPtr vHandle = FindWindow("#32770", "Windows 任务管理器"); 
     vHandle = FindWindowEx(vHandle, IntPtr.Zero, "#32770", null); 
     vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", null); 
     if (vHandle == IntPtr.Zero) return; 
     int vItemCount = ListView_GetItemCount(vHandle); 
     uint vProcessId; 
     GetWindowThreadProcessId(vHandle, out vProcessId); 
  
     IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | 
         PROCESS_VM_WRITE, false, vProcessId); 
     IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, 4096, 
         MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
     try 
     { 
         for (int i = 0; i  < vItemCount; i++) 
         { 
             byte[] vBuffer = new byte[256]; 
             LVITEM[] vItem = new LVITEM[1]; 
             vItem[0].mask = LVIF_TEXT; 
             vItem[0].iItem = i; 
             vItem[0].iSubItem = 0; 
             vItem[0].cchTextMax = vBuffer.Length; 
             vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM))); 
             uint vNumberOfBytesRead = 0; 
  
             WriteProcessMemory(vProcess, vPointer, 
                 Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), 
                 Marshal.SizeOf(typeof(LVITEM)), ref vNumberOfBytesRead); 
             SendMessage(vHandle, LVM_GETITEMW, i, vPointer.ToInt32()); 
             ReadProcessMemory(vProcess, 
                 (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(LVITEM))), 
                 Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), 
                 vBuffer.Length, ref vNumberOfBytesRead); 
  
             string vText = Marshal.PtrToStringUni( 
                 Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0)); 
             Console.WriteLine(vText); 
         } 
     } 
     finally 
     { 
         VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); 
         CloseHandle(vProcess); 
     } 
 } 
  
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值