MODI MiSelectRects получает неверные координаты

У меня есть приложение Windows Form, которое при запуске запускает Firefox, захватывает процесс и дескриптор окна, делает снимок экрана Firefox, сохраняет его на диск (temp.bmp) и вызывает ProcessGetWindow. Я в основном использую MiSelectRects в MODI, чтобы захватить прямоугольник вокруг слова, которое я ищу, а затем использую AutoIT, чтобы щелкнуть мышью по слову.

Проблема в том, что мои координаты отклонены примерно на 10 пикселей от верха.

Есть идеи, что может быть не так? Вот функция, выполняющая обработку. Я закомментировал обработку AutoIT, и я просто отлаживаю с помощью MessageBox, чтобы показать мне фактические координаты. Затем я подтверждаю с помощью инструмента AutoIT Window Info, и он определенно выключен ... Я что-то делаю не так или что-то не так с MODI?

public void ProcessGetWindow(Bitmap image)
        {           
            Document modiDoc = null;
            MiDocSearch modiSearch = null;
            IMiSelectableItem modiTextSel = null;
            MiSelectRects modiSelectRects = null;
            MiSelectRect modiSelectRect = null;
            MiRects modiRects = null;
            int intSelInfoPN;
            string intSelInfoTop;
            int intSelInfoBottom;
            string intSelInfoLeft;
            int intSelInfoRight;            

            // Load an existing image file.
            modiDoc = new Document();
            modiDoc.Create(@"C:\\temp.bmp");

            // Perform OCR.
            modiDoc.Images[0].OCR();

            // Search for the selected word.
            modiSearch = new MiDocSearch();
            modiSearch.Initialize(modiDoc, "Click Me", 0, 0, false, false);
            modiSearch.Search(null, ref modiTextSel);       

            try
            {          
                modiSelectRects = modiTextSel.GetSelectRects();
            }
            catch (COMException)
            {
                MessageBox.Show("Me thinks that the OCR didn't work right!");
            }

            foreach (MiSelectRect mr in modiSelectRects)
            {
                //intSelInfoPN = mr.PageNumber.ToString();
                intSelInfoTop = mr.Top.ToString();
                //intSelInfoBottom = mr.Bottom;
                intSelInfoLeft = mr.Left.ToString();
                //intSelInfoRight = mr.Right;

                /*AutoItX3 auto = new AutoItX3();
                auto.AutoItSetOption("MouseCoordMode", 2);
                auto.MouseClick("", intSelInfoLeft, intSelInfoTop, 1, 80);*/

                MessageBox.Show("Coordinates: " + intSelInfoLeft + ", " + intSelInfoTop, "Coordinates", MessageBoxButtons.OK);            
            }

            //string textResult = modiTextSel.Text;

            //MessageBox.Show(textResult, "Search Results", MessageBoxButtons.OK);

            // Close this dialog.
            Application.Exit();
        }

person Woody    schedule 19.01.2012    source источник
comment
К вашему сведению, Microsoft исключила MODI. Когда ваши пользователи обновятся до Office 2010, вы столкнетесь с проблемами.   -  person TrueWill    schedule 28.01.2012


Ответы (2)


Я использую ту же программу, чтобы найти местоположение.

int centerwidth = (intSelInfoRight - intSelInfoLeft)/2;
                centerwidth = intSelInfoLeft + centerwidth;
                 int centerheight = (intSelInfoBottom - intSelInfoTop)/2;
                 centerheight = centerheight + intSelInfoTop;

Вы можете найти точную среднюю точку текста, используя его.

Но эта программа всегда указывает место первого появления слова, а не следующее его появление. Пожалуйста, дайте мне знать, как найти расположение текста во всех случаях.

person Mohamed Mahir    schedule 29.04.2014

Я не знаком с представленными инструментами, но из того, что я прочитал, функция GetSelectRects возвращает ограничивающий прямоугольник, то есть наименьший прямоугольник, содержащий весь выбор, в данном случае слово, которое вы искали. Я считаю, что происходит то, что вы щелкаете по углу ограничивающего прямоугольника, а не в середине, где находится слово.

Вычислите координаты центра прямоугольника и попробуйте щелкнуть по нему:

int height = mr.Bottom - mr.Top;
int width = mr.Right - mr.Left;

AutoItX3 auto = new AutoItX3();
auto.AutoItSetOption("MouseCoordMode", 2);
auto.MouseClick("", width/2, height/2, 1, 80);
person Michael    schedule 27.01.2012