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

来源:互联网 发布:mac系统卸载程序 编辑:程序博客网 时间:2024/06/10 18:09
1.listviewusing 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); } 


 

原创粉丝点击