/// <summary> /// Возвращает точку, расположенную по центру указанного пункта /// </summary> /// <param name="item">Handle пункта дерева</param> /// <returns>Точка по центру указанного пункта</returns> public Point GetItemPoint(IntPtr item) { RECT rct = new RECT(); while (rct.Left > MaxCorrectCoord || rct.Top > MaxCorrectCoord || rct.Left <= 0 || rct.Top <= 0) { Win32API.GetWindowThreadProcessId(handle, out int pid); IntPtr process = Win32API.OpenProcess( Win32API.ProcessAccessFlags.VirtualMemoryOperation | Win32API.ProcessAccessFlags.VirtualMemoryRead | Win32API.ProcessAccessFlags.VirtualMemoryWrite | Win32API.ProcessAccessFlags.QueryInformation, false, pid); IntPtr pBool = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int))); Marshal.WriteInt32(pBool, 0, 1); int sizeRct = Marshal.SizeOf(typeof(RECT)); IntPtr hRct = Marshal.AllocHGlobal(sizeRct); var hRecItem = Win32API.VirtualAllocEx(process, IntPtr.Zero, sizeRct, Win32API.AllocationType.Commit, Win32API.MemoryProtection.ReadWrite); Win32API.WriteProcessMemory(process, hRecItem, item, sizeRct, out IntPtr written); Win32API.SendMessage(handle, TreeViewMessages.TVM_GETITEMRECT, pBool, hRecItem); Win32API.ReadProcessMemory(process, hRecItem, hRct, sizeRct, out IntPtr read); rct = (RECT)Marshal.PtrToStructure(hRct, typeof(RECT)); Win32API.CloseHandle(process); } Win32API.GetWindowRect(handle, out RECT treeRect); int x = (rct.Left + rct.Right) / 2 + treeRect.Left; int y = (rct.Top + rct.Bottom) / 2 + treeRect.Top; return(new Point(x, y)); }