Пример #1
0
 /// <summary>
 /// Показать скрытое окно
 /// </summary>
 /// <param name="process">Процесс</param>
 /// <param name="windowHandle">Дескриптор окна</param>
 /// <param name="windowWmCommand">Команда для открытия окна</param>
 public static void ShowHiddenWindow(Process process,
                                     IntPtr windowHandle, int windowWmCommand)
 {
     if (PI.IsWindowVisible(windowHandle) == false)
     {
         PI.SendMessage(process.MainWindowHandle,
                        (uint)PI.WM.COMMAND, windowWmCommand, 0);
         return;
     }
 }
Пример #2
0
 public static void CheckShown()
 {
     if (PI.IsWindowVisible(wndModeVisibilePtr) == true)
     {
         modeIsShown = true;
     }
     else
     {
         modeIsShown = false;
     }
 }
Пример #3
0
 public static void CheckShown()
 {
     if (PI.IsWindowVisible(wndDevVisibilePtr) == true)
     {
         deviceIsShown = true;
     }
     else
     {
         deviceIsShown = false;
     }
 }
Пример #4
0
        public bool IsOverlapped()
        {
            if (_blurValues.BlurWhenFocusLost ||
                !PI.IsWindowVisible(_parentForm.Handle)
                )
            {
                return(false);
            }

            IntPtr hWnd = _parentForm.Handle;
            // The set is used to make calling GetWindow in a loop stable by checking if we have already
            //  visited the window returned by GetWindow. This avoids the possibility of an infinite loop.
            var visited = new HashSet <IntPtr> {
                hWnd
            };

            try
            {
                Form activeForm = Form.ActiveForm;
                if (activeForm != null)
                {
                    visited.Add(activeForm.Handle);
                }

                visited.Add(_visualBlur.Handle);


                PI.RECT thisRect = new();
                PI.GetWindowRect(hWnd, ref thisRect);

                while ((hWnd = PI.GetWindow(hWnd, PI.GetWindowType.GW_HWNDPREV)) != IntPtr.Zero &&
                       !visited.Contains(hWnd))
                {
                    visited.Add(hWnd);
                    PI.RECT testRect = new();
                    if (PI.IsWindowVisible(hWnd) &&
                        PI.GetWindowRect(hWnd, ref testRect) &&
                        PI.IntersectRect(out _, ref thisRect, ref testRect)
                        )
                    {
                        return(true);
                    }
                }

                return(false);
            }
            finally
            {
                // Attempt to clear sooner to allow handles to be released.
                visited.Clear();
                visited = null;
            }
        }
Пример #5
0
        /// <summary>
        /// Заменить панели заданного окна.
        /// </summary>
        /// <param name="dialogHandle">Дескриптор нового диалога</param>
        /// <param name="panelPtr">Дескриптор старого диалога</param>
        public static void ChangeWindowMainPanels(ref IntPtr dialogHandle,
                                                  ref IntPtr panelPtr)
        {
            var panelList = PI.GetChildWindows(dialogHandle);

            if (panelList.Count > 0)
            {
                panelPtr = panelList[0];
            }

            if (panelPtr == IntPtr.Zero)
            {
                MessageBox.Show("Не удалось скрыть окно!");
                return;
            }

            // Проверка, скрыт ли элемент управления с редактором.
            if (PI.IsWindowVisible(dialogHandle) == false)
            {
                PI.ShowWindow(dialogHandle, 1);
            }

            PI.ShowWindow(panelPtr, 0);
        }
Пример #6
0
        /// <summary>
        /// Поиск закрепленного представления окна в процессе.
        /// </summary>
        /// <param name="currentProcess">Текущий процесс</param>
        /// <param name="stringBuffer">Буфер</param>
        /// <param name="windowName">Имя окна</param>
        /// <param name="dialogHandle">Handle диалога выходной</param>
        /// <param name="wndVisiblePtr">Найденный дескриптор окна</param>
        private static void SearchStaticWindow(Process currentProcess,
                                               StringBuilder stringBuffer, string windowName,
                                               ref IntPtr dialogHandle, ref IntPtr wndVisiblePtr)
        {
            List <IntPtr> resW = PI.GetChildWindows(currentProcess.MainWindowHandle);

            foreach (IntPtr panel in resW)
            {
                PI.GetWindowText(panel, stringBuffer, stringBuffer.Capacity);
                if (stringBuffer.ToString().Contains(windowName) == true)
                {
                    if (PI.IsWindowVisible(panel) == true)
                    {
                        var resList = PI.GetChildWindows(panel);
                        if (resList.Count > 0)
                        {
                            dialogHandle  = resList[0];
                            wndVisiblePtr = dialogHandle;
                            break;
                        }
                    }
                }
            }
        }
Пример #7
0
        public static bool modeIsShown = false;  // Показано ли окно.

        /// <summary>
        /// Инициализация формы данными для редактирования.
        ///
        /// Так как данная форма отображается как внутреннее окно, то алгоритм
        /// следующий:
        /// 1 Поиск окна "Основные данные изделия" (меню Сервисные программы ->
        /// Изделие -> Навигатор основных данных изделий).
        /// 1.1 Поиск плавающего представления: через FindWindowByCaption,
        /// потом для поиска панели и диалога DlgItemId (0xE81F - базовая панель,
        /// 0x32С8 - диалог). Если окно найдено, то переходим к 4,  иначе к 1.1.1.
        /// 1.1.1 Поиск плавающего представления: иногда не отображается заголовок
        /// из-за чего невозможно сразу определить окно, тогда проверяются потомки окон,
        /// которые могут содержать заголовок родительского окна. Если не найдены заголовки,
        /// то переходим к 1.2 (значит плавающего представления нет).
        /// 1.2 Поиск закрепленного представления: через GetDlgItem для всех дочерних
        /// окон (GetChildWindows) приложения Eplan по DlgItemId (0x32C8 - диалог).
        /// Если окно найдено, то переходим к 4, иначе к 2.
        /// 2 Симулируем нажатие пункта меню (Сервисные программы ->
        /// Изделие -> Навигатор основных данных изделий - 35357)
        /// для его отображения.
        /// 3 Повторяем поиск окна (1.1, 1.1.1 и 1.2). Если окно не найдено выводим
        /// сообщение об ошибке, завершаем редактирование, иначе к 4.
        /// 4 Скрываем панель с элементами управления Eplan'а
        /// (GetDlgItem, 0x3E6 - родительская панель, ShowWindow).
        /// 5. Переносим на найденное окно свои элементы (SetParent) и подгоняем
        /// из размеры и позицию.
        /// 6. Устанавливаем свой хук для найденного окна (для изменения размеров
        /// своих элементов, сохранения изменений при закрытии и отключения хука).
        /// </summary>

        public void ShowDlg()
        {
            System.Diagnostics.Process oCurrent =
                System.Diagnostics.Process.GetCurrentProcess();

            const int wndWmCommand = 35093; // Идентификатор команды вызова окна "Штекеры"

            if (modeIsShown == true)
            {
                if (PI.IsWindowVisible(wndModeVisibilePtr) == false)
                {
                    PI.SendMessage(oCurrent.MainWindowHandle,
                                   (uint)PI.WM.COMMAND, wndWmCommand, 0);
                    return;
                }
                return;
            }

            string windowName = "Штекеры";

            IntPtr res = PI.FindWindowByCaption(
                IntPtr.Zero, windowName);                  //1.1

            if (res != IntPtr.Zero)
            {
                var resList = PI.GetChildWindows(res);
                if (resList.Count > 0)
                {
                    wndHandle          = PI.GetParent(resList[0]);
                    dialogHandle       = resList[0];
                    wndModeVisibilePtr = dialogHandle; // Сохраняем дескриптор окна.
                }
            }
            else
            {
                StringBuilder stringBuffer = new StringBuilder(200);        //1.1.1

                List <IntPtr> mainWindowChilds = PI.GetChildWindows(PI.GetDesktopWindow());
                foreach (IntPtr mainWindowChild in mainWindowChilds)
                {
                    PI.GetWindowText(mainWindowChild, stringBuffer, stringBuffer.Capacity);
                    if (stringBuffer.ToString().Contains(windowName) == false &&
                        stringBuffer.ToString().Contains("EPLAN") == false)
                    {
                        List <IntPtr> windowChilds = PI.GetChildWindows(mainWindowChild);
                        foreach (IntPtr windowChild in windowChilds)
                        {
                            PI.GetWindowText(windowChild, stringBuffer, stringBuffer.Capacity);
                            if (stringBuffer.ToString().Contains(windowName) == true)
                            {
                                if (PI.IsWindowVisible(windowChild) == true)
                                {
                                    // Если нашел в потомке название, беру родительское окно и работаю с ним
                                    var resList = PI.GetChildWindows(mainWindowChild);
                                    if (resList.Count > 0)
                                    {
                                        dialogHandle       = resList[0];
                                        res                = dialogHandle;
                                        wndModeVisibilePtr = dialogHandle; // Сохраняем дескриптор окна.
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }

                List <IntPtr> resW = PI.GetChildWindows(oCurrent.MainWindowHandle);        //1.2
                foreach (IntPtr panel in resW)
                {
                    PI.GetWindowText(panel, stringBuffer, stringBuffer.Capacity);
                    if (stringBuffer.ToString().Contains(windowName) == true)
                    {
                        if (PI.IsWindowVisible(panel) == true)
                        {
                            var resList = PI.GetChildWindows(panel);
                            if (resList.Count > 0)
                            {
                                dialogHandle       = resList[0];
                                res                = dialogHandle;
                                wndModeVisibilePtr = dialogHandle; // Сохраняем дескриптор окна.
                                break;
                            }
                        }
                    }
                }

                if (res == IntPtr.Zero)
                {
                    PI.SendMessage(oCurrent.MainWindowHandle,
                                   (uint)PI.WM.COMMAND, wndWmCommand, 0);     //2

                    res = PI.FindWindowByCaption(
                        IntPtr.Zero, windowName);          //3

                    if (res != IntPtr.Zero)
                    {
                        var resList = PI.GetChildWindows(res);
                        if (resList.Count > 0)
                        {
                            dialogHandle       = resList[0];
                            wndHandle          = PI.GetParent(resList[0]);
                            wndModeVisibilePtr = dialogHandle; // Сохраняем дескриптор окна.
                        }
                    }
                    else
                    {
                        mainWindowChilds = PI.GetChildWindows(PI.GetDesktopWindow());
                        foreach (IntPtr mainWindowChild in mainWindowChilds)
                        {
                            PI.GetWindowText(mainWindowChild, stringBuffer, stringBuffer.Capacity);
                            if (stringBuffer.ToString().Contains(windowName) == false &&
                                stringBuffer.ToString().Contains("EPLAN") == false)
                            {
                                List <IntPtr> windowChilds = PI.GetChildWindows(mainWindowChild);
                                foreach (IntPtr windowChild in windowChilds)
                                {
                                    PI.GetWindowText(windowChild, stringBuffer, stringBuffer.Capacity);
                                    if (stringBuffer.ToString().Contains(windowName) == true)
                                    {
                                        // Если нашел в потомке название, беру родительское окно и работаю с ним
                                        var resList = PI.GetChildWindows(mainWindowChild);
                                        if (resList.Count > 0)
                                        {
                                            dialogHandle       = resList[0];
                                            wndModeVisibilePtr = dialogHandle; // Сохраняем дескриптор окна.
                                            break;
                                        }
                                    }
                                }
                            }
                        }

                        resW = PI.GetChildWindows(oCurrent.MainWindowHandle);
                        foreach (IntPtr panel in resW)
                        {
                            PI.GetWindowText(panel, stringBuffer, stringBuffer.Capacity);
                            if (stringBuffer.ToString().Contains(windowName) == true)
                            {
                                var resList = PI.GetChildWindows(panel);
                                if (resList.Count > 0)
                                {
                                    dialogHandle       = resList[0];
                                    wndModeVisibilePtr = dialogHandle; // Сохраняем дескриптор окна.
                                    break;
                                }
                            }
                        }

                        if (dialogHandle == IntPtr.Zero)
                        {
                            MessageBox.Show("Не удалось найти окно!");
                            return;
                        }
                    }
                }
            }

            var panelList = PI.GetChildWindows(dialogHandle);           //4

            if (panelList.Count > 0)
            {
                panelPtr = panelList[0];
            }

            if (panelPtr == IntPtr.Zero)
            {
                MessageBox.Show("Не удалось скрыть окно!");
                return;
            }

            PI.ShowWindow(panelPtr, 0);
            this.Controls.Clear();

            modesTreeViewAdv.Show();
            PI.SetParent(modesTreeViewAdv.Handle, dialogHandle);         //5
            PI.SetParent(toolStrip.Handle, dialogHandle);

            IntPtr dialogPtr = PI.GetParent(modesTreeViewAdv.Handle);

            PI.RECT rctDialog;
            PI.RECT rctPanel;
            PI.GetWindowRect(dialogPtr, out rctDialog);
            PI.GetWindowRect(panelPtr, out rctPanel);

            int w = rctDialog.Right - rctDialog.Left;
            int h = rctDialog.Bottom - rctDialog.Top;

            toolStrip.Location        = new Point(0, 0);
            modesTreeViewAdv.Location = new Point(0, 0 + toolStrip.Height);

            toolStrip.Width         = w;
            modesTreeViewAdv.Width  = w;
            modesTreeViewAdv.Height = h - toolStrip.Height;

            uint pid = PI.GetWindowThreadProcessId(dialogHandle, IntPtr.Zero);        //6

            dialogHookPtr = PI.SetWindowsHookEx(PI.HookType.WH_CALLWNDPROC,
                                                dialogCallbackDelegate, IntPtr.Zero, pid);

            PI.SetWindowText(dialogHandle, caption);
            PI.SetWindowText(wndHandle, caption);

            modeIsShown = true;
        }