C#怎么取外部程序的listview,treeview的内容?

1.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); 
    } 
} 
 
 
 
// 2.treeview
 
using System.Runtime.InteropServices; 
  
public const int TV_FIRST = 0x1100; 
public const int TVM_GETCOUNT = TV_FIRST + 5; 
public const int TVM_GETNEXTITEM = TV_FIRST + 10; 
public const int TVM_GETITEMA = TV_FIRST + 12; 
public const int TVM_GETITEMW = TV_FIRST + 62; 
  
public const int TVGN_ROOT = 0x0000; 
public const int TVGN_NEXT = 0x0001; 
public const int TVGN_PREVIOUS = 0x0002; 
public const int TVGN_PARENT = 0x0003; 
public const int TVGN_CHILD = 0x0004; 
public const int TVGN_FIRSTVISIBLE = 0x0005; 
public const int TVGN_NEXTVISIBLE = 0x0006; 
public const int TVGN_PREVIOUSVISIBLE = 0x0007; 
public const int TVGN_DROPHILITE = 0x0008; 
public const int TVGN_CARET = 0x0009; 
public const int TVGN_LASTVISIBLE = 0x000A; 
  
public const int TVIF_TEXT = 0x0001; 
public const int TVIF_IMAGE = 0x0002; 
public const int TVIF_PARAM = 0x0004; 
public const int TVIF_STATE = 0x0008; 
public const int TVIF_HANDLE = 0x0010; 
public const int TVIF_SELECTEDIMAGE = 0x0020; 
public const int TVIF_CHILDREN = 0x0040; 
public const int TVIF_INTEGRAL = 0x0080; 
  
[DllImport("User32.DLL")] 
public static extern int SendMessage(IntPtr hWnd, 
    uint Msg, int wParam, int lParam); 
  
[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; 
  
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 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); 
  
[DllImport("user32.dll")] 
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, 
    out uint dwProcessId); 
  
[StructLayout(LayoutKind.Sequential)] 
public struct TVITEM 
{ 
    public int mask; 
    public IntPtr hItem; 
    public int state; 
    public int stateMask; 
    public IntPtr pszText; 
    public int cchTextMax; 
    public int iImage; 
    public int iSelectedImage; 
    public int cChildren; 
    public IntPtr lParam; 
    public IntPtr HTreeItem; 
}      
  
public static uint TreeView_GetCount(IntPtr hwnd) 
{ 
    return (uint)SendMessage(hwnd, TVM_GETCOUNT, 0, 0); 
} 
  
public static IntPtr TreeView_GetNextItem(IntPtr hwnd, IntPtr hitem, int code) 
{ 
    return (IntPtr)SendMessage(hwnd, TVM_GETNEXTITEM, code, (int)hitem); 
} 
  
public static IntPtr TreeView_GetRoot(IntPtr hwnd) 
{ 
    return TreeView_GetNextItem(hwnd, IntPtr.Zero, TVGN_ROOT); 
} 
  
public static IntPtr TreeView_GetChild(IntPtr hwnd, IntPtr hitem) 
{ 
    return TreeView_GetNextItem(hwnd, hitem, TVGN_CHILD); 
} 
  
public static IntPtr TreeView_GetNextSibling(IntPtr hwnd, IntPtr hitem) 
{ 
    return TreeView_GetNextItem(hwnd, hitem, TVGN_NEXT); 
} 
  
public static IntPtr TreeView_GetParent(IntPtr hwnd, IntPtr hitem) 
{ 
    return TreeView_GetNextItem(hwnd, hitem, TVGN_PARENT); 
} 
  
public static IntPtr TreeNodeGetNext(IntPtr AHandle, IntPtr ATreeItem) 
{ 
    if (AHandle == IntPtr.Zero || ATreeItem == IntPtr.Zero) return IntPtr.Zero; 
    IntPtr result = TreeView_GetChild(AHandle, ATreeItem); 
    if (result == IntPtr.Zero) 
        result = TreeView_GetNextSibling(AHandle, ATreeItem); 
  
    IntPtr vParentID = ATreeItem; 
    while (result == IntPtr.Zero && vParentID != IntPtr.Zero) 
    { 
        vParentID = TreeView_GetParent(AHandle, vParentID); 
        result = TreeView_GetNextSibling(AHandle, vParentID); 
    } 
    return result; 
} 
  
public static bool GetTreeViewText(IntPtr AHandle, List<string> AOutput) 
{ 
    if (AOutput == null) return false; 
    uint vProcessId; 
    GetWindowThreadProcessId(AHandle, 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
    { 
        uint vItemCount = TreeView_GetCount(AHandle); 
        IntPtr vTreeItem = TreeView_GetRoot(AHandle); 
        Console.WriteLine(vItemCount); 
        for (int i = 0; i < vItemCount; i++) 
        { 
            byte[] vBuffer = new byte[256]; 
            TVITEM[] vItem = new TVITEM[1]; 
            vItem[0] = new TVITEM(); 
            vItem[0].mask = TVIF_TEXT; 
            vItem[0].hItem = vTreeItem; 
            vItem[0].pszText = (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(TVITEM))); 
            vItem[0].cchTextMax = vBuffer.Length; 
            uint vNumberOfBytesRead = 0; 
            WriteProcessMemory(vProcess, vPointer, 
                Marshal.UnsafeAddrOfPinnedArrayElement(vItem, 0), 
                Marshal.SizeOf(typeof(TVITEM)), ref vNumberOfBytesRead); 
            SendMessage(AHandle, TVM_GETITEMA, 0, (int)vPointer); 
            ReadProcessMemory(vProcess, 
                (IntPtr)((int)vPointer + Marshal.SizeOf(typeof(TVITEM))), 
                Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0), 
                vBuffer.Length, ref vNumberOfBytesRead); 
            Console.WriteLine(Marshal.PtrToStringAnsi( 
                Marshal.UnsafeAddrOfPinnedArrayElement(vBuffer, 0))); 
  
            vTreeItem = TreeNodeGetNext(AHandle, vTreeItem); 
        } 
    } 
    finally
    { 
        VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); 
        CloseHandle(vProcess); 
    } 
    return true; 
} 
  
private void button1_Click(object sender, EventArgs e) 
{ 
    List<string> vOutput = new List<string>(); 
    GetTreeViewText((IntPtr)xxxx, vOutput); // xxxx替换成相应treeview句柄。获得参考上贴FindWindow()的使用 
    foreach (string vLine in vOutput) 
        Console.WriteLine(vLine); 
} 


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值