Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <summary>
        /// Получает пункт "Расчёт"->"Линейный" в дереве действий главного окна SCAD
        /// </summary>
        /// <returns>Handle пункта "Линеный"</returns>
        public IntPtr GetLinearCalcuationsItem()
        {
            IntPtr treeItem = IntPtr.Zero;

            while (treeItem == IntPtr.Zero)
            {
                handle   = Win32API.WindowFromPoint(new Point(Settings.DefaultX, Settings.DefaultY));
                treeItem = Win32API.SendMessage(handle, TreeViewMessages.TVM_GETNEXTITEM, TreeViewMessages.GetRoot, IntPtr.Zero);
                treeItem = Win32API.SendMessage(handle, TreeViewMessages.TVM_GETNEXTITEM, TreeViewMessages.GetNext, treeItem);
                treeItem = Win32API.SendMessage(handle, TreeViewMessages.TVM_GETNEXTITEM, TreeViewMessages.GetChild, treeItem);
                Win32API.SendMessage(handle, TreeViewMessages.TVM_SELECTITEM, TreeViewMessages.SelectItem, treeItem);
            }
            return(treeItem);
        }