public static void ItemClick(this IntPtr treeViewHwnd, IntPtr itemHwnd, Size offSet) { uint vProcessId; User32Api.GetWindowThreadProcessId(treeViewHwnd, out vProcessId); var vProcess = Kernel32Api.OpenProcess( WindowsMessageApi.PROCESS_ALL_ACCESS, false, vProcessId ); var remoteBuffer = Kernel32Api.VirtualAllocEx(vProcess, IntPtr.Zero, (uint)Marshal.SizeOf(typeof(User32Api.RectApi)), WindowsMessageApi.MEM_COMMIT, WindowsMessageApi.PAGE_EXECUTE_READWRITE); try { var rc = new User32Api.RectApi { left = itemHwnd.ToInt32() }; var localBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(rc)); Marshal.StructureToPtr(rc, localBuffer, false); int vNumberOfBytes; Kernel32Api.WriteProcessMemory(vProcess, remoteBuffer, localBuffer, Marshal.SizeOf(typeof(User32Api.RectApi)), out vNumberOfBytes); User32Api.SendMessage(treeViewHwnd, WindowsMessageApi.TVM_SELECTITEM, WindowsMessageApi.TVGN_CARET, itemHwnd.ToInt32()); User32Api.SendMessage(treeViewHwnd, WindowsMessageApi.TVM_ENSUREVISIBLE, 0, itemHwnd.ToInt32()); User32Api.SendMessage(treeViewHwnd, WindowsMessageApi.TVM_GETITEMRECT, 1, remoteBuffer.ToInt32()); Kernel32Api.ReadProcessMemory(vProcess, remoteBuffer, localBuffer, Marshal.SizeOf(typeof(User32Api.RectApi)), out vNumberOfBytes); rc = (User32Api.RectApi)Marshal.PtrToStructure(localBuffer, typeof(User32Api.RectApi)); var pt = rc.ToRectangle().Center() + offSet; User32Api.SendMessage(treeViewHwnd, WindowsMessageApi.WM_LBUTTONDBLCLK, 0, (int)MAKELPARAM((uint)pt.X, (uint)pt.Y)); } finally { Kernel32Api.VirtualFreeEx(vProcess, remoteBuffer, (uint)Marshal.SizeOf(typeof(User32Api.RectApi)), WindowsMessageApi.MEM_FREE); Kernel32Api.CloseHandle(vProcess); } }
public static string GetItemText(this IntPtr treeViewHwnd, IntPtr itemHwnd) { var result = new StringBuilder(1024); uint vProcessId; User32Api.GetWindowThreadProcessId(treeViewHwnd, out vProcessId); var vProcess = Kernel32Api.OpenProcess( WindowsMessageApi.PROCESS_VM_OPERATION | WindowsMessageApi.PROCESS_VM_READ | WindowsMessageApi.PROCESS_VM_WRITE, false, vProcessId ); var pStrBufferMemory = Kernel32Api.VirtualAllocEx(vProcess, IntPtr.Zero, 1024, WindowsMessageApi.MEM_COMMIT, WindowsMessageApi.PAGE_READWRITE); var remoteBuffer = Kernel32Api.VirtualAllocEx(vProcess, IntPtr.Zero, (uint)Marshal.SizeOf(typeof(User32Api.TVITEM)), WindowsMessageApi.MEM_COMMIT, WindowsMessageApi.PAGE_EXECUTE_READWRITE); try { var tvItem = new User32Api.TVITEM { mask = WindowsMessageApi.TVIF_TEXT, hItem = itemHwnd, pszText = pStrBufferMemory, cchTextMax = 1024 }; var localBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(tvItem)); Marshal.StructureToPtr(tvItem, localBuffer, false); int vNumberOfBytesWrite; Kernel32Api.WriteProcessMemory( vProcess, remoteBuffer, localBuffer, Marshal.SizeOf(typeof(User32Api.TVITEM)), out vNumberOfBytesWrite); User32Api.SendMessage(treeViewHwnd, WindowsMessageApi.TVM_GETITEM, 0, remoteBuffer.ToInt32()); int vNumberOfBytesRead; Kernel32Api.ReadProcessMemory( vProcess, pStrBufferMemory, result, 1024, out vNumberOfBytesRead ); } finally { Kernel32Api.VirtualFreeEx(vProcess, pStrBufferMemory, 0, WindowsMessageApi.MEM_RELEASE); Kernel32Api.VirtualFreeEx(vProcess, remoteBuffer, 0, WindowsMessageApi.MEM_RELEASE); Kernel32Api.CloseHandle(vProcess); } return(result.ToString()); }